gpt4 book ai didi

c# - Threadstart 在定时器的循环中只执行所述循环中的最后一个线程。

转载 作者:太空宇宙 更新时间:2023-11-03 20:31:27 25 4
gpt4 key购买 nike

我有一个计时器执行一个执行一系列线程的循环。每个线程简单地轮询串行设备(在唯一端口上)并将数据写入 MySQL 数据库以供 Web 应用程序获取。

我注意到只有循环中的最后一个线程正在执行。

这是我的计时器 Interval方法。

static void glob_timer_Elapsed(object sender, ElapsedEventArgs e)
{
foreach (object[] row in user_ids)
{
Console.WriteLine(row[0].ToString() + ":" + row[1].ToString());
ThreadStart starter = delegate { Functions.UpdateFor(row[0].ToString(), row[1].ToString()); };
new Thread(starter).Start();
}
}

user_ids 是 List<object[]>包含来自查询的行;所以row[0] = 用户 IDrow[1] = Com 端口名称

在函数中 UpdateFor() :

public static void UpdateFor(string uid, string com_name)
{
try
{
Console.WriteLine("[" + uid + "]- " + DateTime.Now.ToString() + " : " + "Begin read transmission.");

运行时,在控制台中我看到

 1:COM1 
2:COM2
[2]-{DateTime} : Begin read transmission

为什么我没有看到 UpdateFor对于 uid 1。

注意:我还验证了应该从 COM1 写入数据库的数据从未被写入。

最佳答案

您遇到了关闭问题。每个委托(delegate)在每个循环、迭代中捕获对 object[] row 的引用,因此它们都使用相同的引用执行,即 row 的最终值是什么。您只需分配一个内部变量即可确保每个委托(delegate)都获得唯一的引用。

 foreach (object[] row in user_ids)
{
var innerReference = row;
Console.WriteLine(innerReference[0].ToString() + ":" + innerReference[1].ToString());
ThreadStart starter = delegate { Functions.UpdateFor(innerReference[0].ToString(), innerReference[1].ToString()); };
new Thread(starter).Start();
}

关于c# - Threadstart 在定时器的循环中只执行所述循环中的最后一个线程。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7352757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com