小编Dre*_*teh的帖子

对C#循环中的多线程感到困惑

可能重复:
C#捕获的变量循环

我对多线程编程很陌生.当我运行下面的代码,只有最后一个孩子被执行.有人可以告诉我发生了什么吗?非常感谢你.

private void Process()
{
    Dictionary<int, int> dataDict = new Dictionary<int, int>();
    dataDict.Add(1, 2000);
    dataDict.Add(2, 1000);
    dataDict.Add(3, 4000);
    dataDict.Add(4, 3000);

    foreach (KeyValuePair<int, int> kvp in dataDict)
    {
        Console.WriteLine("Ready for [" + kvp.Key.ToString() + "]");
        Task.Factory.StartNew(() => DoSomething(kvp.Value, kvp.Key));
    }

private static void DoSomething(int waitTime, int childID)
{
    {               
        Console.WriteLine("Start task [" + childID.ToString() + "]");
        Thread.Sleep(waitTime);
        Console.WriteLine("End task [" + childID.ToString() + "]");
    }
}
Run Code Online (Sandbox Code Playgroud)

产量


Ready for [1]
Ready for [2]
Ready for [3]
Ready for [4] …
Run Code Online (Sandbox Code Playgroud)

c# multithreading

10
推荐指数
1
解决办法
280
查看次数

NLog:在类中传递记录器是一个好的做法吗?

您好,我有一个通用的实用程序类,它将在类中记录一些信息,我将从不同的类中调用该类。应该如何声明我的 Nlog,以便我可以将记录器与不同的调用者分开。

我有以下示例,我希望 Nlog 将 Utilities 类生成的日志相应地保留在 CallerA 和 CallerB 记录器中,我是否应该将记录器引用传递给 Utilities 类?我听说在一堂课上保留一个记录器是一个很好的做法。

非常感谢您的建议=)

命名空间通用
{
    公共课 公用事业
    {
        私有静态只读 Logger _logger = LogManager.GetCurrentClassLogger();

        公共无效DoSomething()
        {
            _logger.Info("在此记录");
        }
    }
}

命名空间项目A
{
    公共类来电者A
    {
        私有静态只读 Logger _logger = LogManager.GetCurrentClassLogger();

        公共无效调用者方法()
        {
            新 Common.Utilities().DoSomething();
        }
    }
}

命名空间项目B
{
    公共类 CallerB
    {
        私有静态只读 Logger _logger = LogManager.GetCurrentClassLogger();

        公共无效调用者方法()
        {
            新 Common.Utilities().DoSomething();
        }
    }
}

.net nlog

5
推荐指数
1
解决办法
623
查看次数

C#数据库包装器设计

我正在为C#设计数据库包装器.以下是我的两个选项:

选项A:

class DBWrapper:IDisposable
{
     private SqlConnection sqlConn;

     public DBWrapper()
     {
            sqlConn = new SqlConnection("my connection string");
            sqlConn.Open();
     }

     public DataTable RunQuery(string Sql)
     {
              implementation......
     }

     public Dispose()
     {
            if(sqlConn != null)
                   sqlConn.Close();
     }
}
Run Code Online (Sandbox Code Playgroud)

选项B:

class DBWrapper
{
     public DBWrapper()
     {            
     }

     public DataTable RunQuery(string Sql)
     {
             SqlConnection sqlConn = new SqlConnection("my connection string");
             .....implementation......
             sqlConn.Close();               
     }   
}
Run Code Online (Sandbox Code Playgroud)

对于选项,在实例化类时打开连接.因此,无论调用者调用RunQuery多少次,连接始终都准备就绪.但是如果应用程序在应用程序的早期实例化DBWrapper,那么在应用程序完成之前,连接将被打开并且什么都不做.此外,它可以在执行期间实例化许多DBWrapper.所以,这有点浪费资源.

对于选项B,它没有选项A具有的问题,但每次调用者调用RunQuery时都必须打开和关闭新连接.我不确定它会对性能有多大影响.

请分享您的专长.谢谢你的阅读.

c# database design-patterns wrapper

3
推荐指数
1
解决办法
7924
查看次数

构建泛型集合类

我正在构建以下类来管理字典.

    public class EnumDictionary<TKey, TValue>
    {
        private Dictionary<TKey, TValue> _Dict;

        public EnumDictionary(Dictionary<TKey, TValue> Dict)
        {
            this._Dict = Dict;
        }

        public TKey GetValue(TValue value)
        {
            foreach (KeyValuePair<TKey, TValue> kvp in _Dict)
            {
                if (kvp.Value == value)
                    return kvp.Key;
            }

            throw new Exception("Undefined data type: " + value);
        }              
    }
Run Code Online (Sandbox Code Playgroud)

但我得到一个错误"运算符'=='不能应用于'TValue'和'TValue'类型的操作数".

顺便说一句,我正在制作这个自定义集合是因为​​我的字典具有独特的价值,但我无法从字典中获取密钥.

任何帮助表示赞赏.谢谢.

c# generics collections dictionary

2
推荐指数
1
解决办法
584
查看次数