c# - 启动和等待多个线程 - Resharper 提示修改后的闭包

标签 c# .net multithreading resharper

我正在尝试按照此处的建议实现多线程:Spawn Multiple Threads for work then wait until all finished

代码如下所示:

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();
            }

这里我收到 ReSharper 警告:if (Interlocked.Decrement(ref clientCount) == 0)

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

这是一个有效的建议吗?

最佳答案

该警告旨在涵盖以下代码

int i = 1;
Func<int> f = () => i + 1;
i = 2;
int j = f(); // What does this set j to?

调用f时将使用i的更新值。该警告建议将其更改为

int i = 1;
int icopy = i;
Func<int> f = () => icopy + 1;
i = 2;
int j = f(); // Now what does this set j to?

如果您希望f看到i创建委托(delegate)时的值。在 foreach 循环的上下文中,很容易出现不直观的行为。正因为如此,C# 5 中 foreach 循环的含义发生了变化。

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

关于c# - 启动和等待多个线程 - Resharper 提示修改后的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12521392/

相关文章:

c# - linq中的动态排序

c# - 在 C# 中将一个 else 与多个 if 语句一起使用

c# - 从 C++ 创建 .Net Standard 对象

c# - 从 simple.data 枚举返回列表

c++ - 浏览器中的多线程 WebAssembly 比单线程慢,为什么?

java - 我没有在 Tomcat 中的 Web 应用程序的线程中获取 Hibernate session

c# - 同时处理数千个数据库调用

C# .Net 向导控件删除动态添加的用户控件

.net - RadAjaxManager AJAX 请求大约有 10% 的时间失败

c# - 在 Unity 中每 10 帧创建一个新线程是个好主意吗?