正在等待一个线程活着的循环良好做法?

时间:2014-11-19 10:51:42

标签: c# multithreading

我们真的必须这样做吗?

// Loop until worker thread activates. while (!workerThread.IsAlive);

在线程函数的开头使用ManualResetEvent(或其他)会不会更好?

修改1:

也许在MSDN示例上下文中,它将是"适当的":

// Start the worker thread. workerThread.Start(); Console.WriteLine("main thread: Starting worker thread...");   // Loop until worker thread activates. while (!workerThread.IsAlive);

否则这只是一种可怕的代码味道。

来源:http://msdn.microsoft.com/en-US/library/7a2f3ay4(v=vs.80).aspx

3 个答案:

答案 0 :(得分:4)

请忽略MSDN示例,它太可怕而且毫无意义。特别是,等待IsAlive的旋转是没有意义的,因为在它有机会执行"之前,没有办法让线程终止"如MSDN所说。在准备就绪之前,线程可以自由检查您为请求终止而设置的标志。旋转等待IsAlive永远不会有意义 - 使用Thread.Join()等待退出,使用事件(或监视器)等待其他状态。

答案 1 :(得分:2)

良好做法是使用Task-based Asynchronous Pattern (TAP)

像这样使用Task.Run

public async Task DoStuff(CancellationToken token)
{
    await Task.Run(
        () => Console.WriteLine("Stuff"),
        token)
}

或只是,

Task.Run(() => Console.WriteLine("Stuff")).Wait();

答案 2 :(得分:1)

没有内置的基础架构可以等待线程启动,因为在大多数情况下这不应该是重要的。我们必须等待线程始终完成,但同时让它做它的业务。

您甚至可能不想等待线程启动。你可能希望线程激活它的一些功能,一般情况下,我可能不止一个这样的功能。没有内置系统可以满足这一需求,因此您必须自己进行同步。

只是创建一个在创建线程时创建的事件,但是在线程运行代码中引发了该事件。当您创建并启动线程等待此事件时就是这样。