vmg*_*ail 6 c# multithreading .net-4.0
在过去的几个小时里,我一直在用这个打击我的头,所以这里就是这样.也许对于多线程经验不足的人来说,这是一个常见的错误?谁知道.
在包含的代码中,我实例化了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());
}
Run Code Online (Sandbox Code Playgroud)
Thread.Start并不意味着线程立即开始运行,它会导致操作系统将当前实例的状态更改为ThreadState.Running。一旦线程处于ThreadState.Running状态,操作系统就可以调度它执行,但这并不意味着最先创建的线程将首先执行。这就是问题的原因。
如果你想让3个线程按顺序运行,你应该考虑线程同步。
| 归档时间: |
|
| 查看次数: |
150 次 |
| 最近记录: |