Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 启动并等待多个线程-Resharper抱怨已修改的闭包_C#_.net_Multithreading_Resharper - Fatal编程技术网

C# 启动并等待多个线程-Resharper抱怨已修改的闭包

C# 启动并等待多个线程-Resharper抱怨已修改的闭包,c#,.net,multithreading,resharper,C#,.net,Multithreading,Resharper,我正试图按照这里的建议实现多线程: 代码看起来是这样的: var resetEvent = new ManualResetEvent(false); var clientsCount = IDLocal.UserSessions.Count; // Load sessions: IDLocal.UserSessions = new IDSessions(); // Start thread for

我正试图按照这里的建议实现多线程:

代码看起来是这样的:

var resetEvent = new ManualResetEvent(false);
            var clientsCount = IDLocal.UserSessions.Count;

            // Load sessions:
            IDLocal.UserSessions = new IDSessions();

            // Start thread for each client 
            foreach (IDSession session in IDLocal.UserSessions)
            {
                var clnt = session;
                new Thread(
                    delegate()
                    {
                        Debug.WriteLine(Thread.CurrentThread.ManagedThreadId);
                        clnt.FailedToRespond = !this.SendDirect(data, this.GetHostAddress(clnt.HostName), clnt.PortNumber);

                        // If we're the last thread, signal 
                        if (Interlocked.Decrement(ref clientsCount) == 0) resetEvent.Set();
                    })
                    .Start();
            }
在这里,我得到了重拾器警告:
if(联锁.减量(ref clientscont)==0)

它表明我正在访问修改后的闭包(ClientScont)


这是一个有效的建议吗?

该警告旨在涵盖以下代码:

int i = 1;
Func<int> f = () => i + 1;
i = 2;
int j = f(); // What does this set j to?
如果希望
f
查看创建代理时的
i
值。在
foreach
循环的上下文中,很容易获得不直观的行为。C#5中的
foreach
循环的含义发生了变化,正是因为这个原因


因为这不是您想要的,因为您确实希望看到对捕获变量的更改,所以不要更改代码中的任何内容。

是的,这是一个有效的建议。应该避免可变的封闭变量。这不是规则的一个例外吗,因为他正在变异一个变量,该变量的值将在线程之间共享?@dugas是的,这不是警告的示例,因此应该忽略此警告。警告是关于在没有意识到变量值发生变化的情况下捕获变量。在这种情况下,您希望更改值。我也这么认为。特别是它引用变量by
ref
Resharper应该比这更聪明。。
int i = 1;
int icopy = i;
Func<int> f = () => icopy + 1;
i = 2;
int j = f(); // Now what does this set j to?