【发布时间】:2014-05-08 21:17:08
【问题描述】:
在过去的几个小时里,我一直对此感到头疼,所以就这样吧。对于没有多线程经验的人来说,这可能是一个常见的错误?谁知道呢。
在包含的代码中,我实例化了 3 个运行方法 DisplayValues(DateTime Now, int Period) 的线程。调试器在每个 if 语句中停止 3 次,并且对于每个语句,它都会使用正确的值进行方法调用。问题是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);
但输出完全不同:
2014 年 5 月 8 日凌晨 4:35:00 期间:0
2014 年 5 月 8 日凌晨 4:50:00 期间:1
2014 年 5 月 8 日上午 4:51:00 时段: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());
}
【问题讨论】:
-
在
DateNow = DateNow.AddMinutes(1);之前放一个Thread.Sleep(10000),我很确定第2 期的输出将是5/8/2014 4:50:00 AM Period: 2- 试试看,然后告诉我。 -
添加
Thread.Sleep(1000)并离开DateNow.AddMinutes(1)将需要很长时间,所以我添加了 Sleep 并更改为 AddMinutes(15)。输出是正确的。然后我删除了 Sleep [kept AddMinutes(15)] 并且输出仍然正确。 -
显然,它与分钟增量有关。不幸的是,我需要更改为
DateNow = DateTime.Now,问题将继续存在。我不能让它保持原样。
标签: c# multithreading .net-4.0