c# - C# - 将参数传递给 Thread 时出现问题
问题描述
我的多线程应用程序有问题。
我有一个包含 4 个线程的数组。
这是我初始化它们的方法:
for (int i = 0; i < threads.Length; i++)
{
threads[i] = new Thread(delegate () { ThreadMethod(i); });
}
但是在我的第一次测试之后,我发现所有四个线程都以3
传递的值运行。
我把它改成
for (int i = 0; i < threads.Length; i++)
{
int id = i;
threads[i] = new Thread(delegate () { ThreadMethod(id); });
}
它有效,但对我来说,似乎必须有更好的方法将我传递i
给我的线程。
我的猜测是否正确,如果是,我应该如何通过i
?
谢谢!
解决方案
闭包使用局部变量——在 for 循环中,为循环声明的变量不是局部变量,它们必须在块 ( {}
) 内。这就是第二个示例有效的原因。
delegate 关键字是创建闭包的对象,它会查找要包含在闭包中的局部变量。当它找到 id 时,它包含它。当它不引用时,它引用的全局(闭包外)值,i
并且在运行时i
的值为 3。
推荐阅读
- flutter - 从 AppLifecycleState.resumed 事件导航到新屏幕?
- django - 如何覆盖 renderer_classes 以在 REST API 中发送额外信息
- azure - 无法通过 Azure AD B2c Graph API 删除用户
- mysql - 使用特定条件过滤时 SQL 给出错误结果
- tensorflow - Tensorflow Keras 官方教程中的折旧警告
- java - 用于布尔组合的 java 较短的 sytnax
- npm - 无法在 Nexus Repository Manager 2.10 上发布库
- python - Python Mysql 卡在 cursor.execute()
- java - 连接sql端口83306
- reactjs - React.js - 可排序树:如何将自定义子数据添加到 React-Sortable-tree?