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

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)

Mat*_*att 1

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

如果你想让3个线程按顺序运行,你应该考虑线程同步。