Multithreading 调用myThread.Start(…)时,我们是否可以保证线程已启动?

Multithreading 调用myThread.Start(…)时,我们是否可以保证线程已启动?,multithreading,c#-3.0,Multithreading,C# 3.0,调用myThread.Start(…)时,我们是否可以保证线程已启动?MSDN文档并没有具体说明这一点。它表示的状态已更改为“正在运行” 我这样问是因为我已经看过几次下面的代码。它创建一个线程,启动它,然后循环,直到状态变为Running。有必要循环吗 Thread t = new Thread(new ParameterizedThreadStart(data)); t.Start(data); while (t.ThreadState != System.Threading.ThreadSt

调用myThread.Start(…)时,我们是否可以保证线程已启动?MSDN文档并没有具体说明这一点。它表示的状态已更改为“正在运行”

我这样问是因为我已经看过几次下面的代码。它创建一个线程,启动它,然后循环,直到状态变为Running。有必要循环吗

Thread t = new Thread(new ParameterizedThreadStart(data));
t.Start(data);
while (t.ThreadState != System.Threading.ThreadState.Running &&
       t.ThreadState != System.Threading.ThreadState.WaitSleepJoin)
{
     Thread.Sleep(10);
}

谢谢

我想这取决于你在循环后做了什么。如果后面的内容严重依赖于线程的运行,那么检查并不是一个坏主意。我个人会使用
ManualResetEvent
Thread
设置的类似工具,而不是检查
ThreadStatus

我想这取决于循环后的操作。如果后面的内容严重依赖于线程的运行,那么检查并不是一个坏主意。我个人会使用
ManualResetEvent
或由
Thread
设置的类似工具,而不是检查
ThreadStatus
否。这会导致“安排线程执行”。它将启动,但在委托中的代码实际运行之前可能需要(短)一段时间。事实上,上面的代码也没有达到(我怀疑)作者的意图。将线程的threadstate设置为threadstate。Running(在中发生)只是确保它计划运行——但是threadstate可以在委托实际执行之前“运行”

正如所建议的,使用
ManualResetEvent
通知主线程线程正在运行,这比休眠和检查线程状态要好得多。

否。导致“线程被安排执行”。它将启动,但在委托中的代码实际运行之前可能需要(短)一段时间。事实上,上面的代码也没有达到(我怀疑)作者的意图。将线程的threadstate设置为threadstate。Running(在中发生)只是确保它计划运行——但是threadstate可以在委托实际执行之前“运行”

正如建议的那样,使用
ManualResetEvent
通知主线程线程正在运行,这比休眠和检查线程状态要好得多。

如果设置为在线程“启动”之前不允许循环继续,那么这将取决于“启动”的确切含义。这是否意味着线程已经由操作系统创建并发出运行信号,但不一定表示它已经完成了任何操作?这是否意味着它执行了一个或多个操作

虽然这很可能没问题,但您的循环不是防弹的,因为从理论上讲,整个线程可能在调用
Start
和检查
ThreadState
之间执行;直接检查属性两次也不是一个好主意

如果您想坚持检查状态,这样做会/可能更可靠:

ThreadState state = t.ThreadState;

while(state != ThreadState.Runnung && state != ThreadState.WaitSleepJoin)
{
    Thread.Sleep(10:

    state = t.ThreadState;
}
然而,这仍然取决于线程启动、运行、然后在您有机会检查之前停止的可能性。是的,您可以扩展
if
语句的范围以包括其他状态,但我建议使用
WaitHandle
来在线程“启动”时发出信号

您仍然有可能在检查之前结束线程,但是一旦线程开始,您就可以保证设置
WaitHandle
。对
WaitOne
的调用将无限期地阻止,直到在
WaitHandle

上调用
Set
,如果设置为在线程“启动”之前不允许循环继续,那么它将取决于“启动”的确切含义。这是否意味着线程已经由操作系统创建并发出运行信号,但不一定表示它已经完成了任何操作?这是否意味着它执行了一个或多个操作

虽然这很可能没问题,但您的循环不是防弹的,因为从理论上讲,整个线程可能在调用
Start
和检查
ThreadState
之间执行;直接检查属性两次也不是一个好主意

如果您想坚持检查状态,这样做会/可能更可靠:

ThreadState state = t.ThreadState;

while(state != ThreadState.Runnung && state != ThreadState.WaitSleepJoin)
{
    Thread.Sleep(10:

    state = t.ThreadState;
}
然而,这仍然取决于线程启动、运行、然后在您有机会检查之前停止的可能性。是的,您可以扩展
if
语句的范围以包括其他状态,但我建议使用
WaitHandle
来在线程“启动”时发出信号


您仍然有可能在检查之前结束线程,但是一旦线程开始,您就可以保证设置
WaitHandle
。对
WaitOne
的调用将无限期阻止,直到在
WaitHandle
上调用了
Set
,谢谢!我喜欢这个主意,而且。。。这个例子!谢谢我喜欢这个主意,而且。。。这个例子!