gpt4 book ai didi

c# - 运行多个并发线程的后果?

转载 作者:太空狗 更新时间:2023-10-29 21:54:05 25 4
gpt4 key购买 nike

在过去的几个小时里,我一直在思考这个问题,所以开始吧。对于没有多线程经验的人来说,这可能是一个常见的错误?谁知道。

在包含的代码中,我实例化了 3 个运行方法 DisplayValues(DateTime Now, int Period) 的线程。调试器在每个 if 语句中停止三次,并且对于每个语句,它都使用正确的值进行方法调用。问题是 Console.WriteLine 显示不稳定的值,与调用方式完全不同。

控制台调用DisplayValues() 3次,参数如下,正确: DisplayValues('{5/8/2014 4:20:00 AM}', 0); DisplayValues('{5/8/2014 4:35:00 AM}', 1); DisplayValues('{5/8/2014 4:50:00 AM}', 2);

但输出完全不同:

5/8/2014 4:35:00 AM 期间:0

5/8/2014 4:50:00 AM 期间:1

5/8/2014 4:51:00 AM 期间:2

调试器确认了这一点。由于它是一个控制台应用程序,我认为可能所有方法都是静态的,所以我将 DisplayValues() 移到了一个类中。然后想到三个类实例都重名了,就改名了。然后我认为它可能是 CancellationTokenSource 对象,所以我也删除了它。

不用说,没有线程输出是正确的。

我知道有一个明显的原因,我只是不知道它是什么。

感谢任何帮助。谢谢。

bool thread0Running = false;
bool thread1Running = false;
bool thread2Running = false;
DateTime DateNow = new DateTime(2014, 5, 8, 4, 0, 0);

while ((!thread0Running || !thread1Running || !thread2Running) && DateNow.Hour == 4)
{
if ((DateNow.Hour == TaskDateTime.Hour) && (DateNow.Minute == 20))
{
thread0Running = true;
Class myClass0 = new Class();
new Thread(() => myClass0.DisplayValues(DateNow, 0, cts0.Token)).Start();

}
else if ((DateNow.Hour == TaskDateTime.Hour) && (DateNow.Minute == 35))
{
thread1Running = true;
Class myClass1 = new Class();
new Thread(() => myClass1.DisplayValues(DateNow, 1, cts1.Token)).Start();
}
else if ((DateNow.Hour == TaskDateTime.Hour) && (DateNow.Minute == 50))
{
thread2Running = true;
Class myClass2 = new Class();
new Thread(() => myClass2.DisplayValues(DateNow, 2, cts2.Token)).Start();
}
DateNow = DateNow.AddMinutes(1);
}
public void DisplayValues(DateTime Now, int Period, Object obj)
{
Console.WriteLine(Now.ToString() + " Period: " + Period.ToString());
}

最佳答案

Thread.Start 并不意味着线程立即开始运行,它会导致操作系统将当前实例的状态更改为ThreadState.Running。一旦一个线程处于ThreadState.Running状态,操作系统就可以调度它执行,但这并不意味着先创建的线程会先执行。这就是问题的原因。

如果要让3个线程按顺序运行,你应该研究线程同步。

关于c# - 运行多个并发线程的后果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23552718/

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