我们真的必须这样做吗?
// 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
答案 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)
没有内置的基础架构可以等待线程启动,因为在大多数情况下这不应该是重要的。我们必须等待线程始终完成,但同时让它做它的业务。
您甚至可能不想等待线程启动。你可能希望线程激活它的一些功能,一般情况下,我可能不止一个这样的功能。没有内置系统可以满足这一需求,因此您必须自己进行同步。
只是创建一个在创建线程时创建的事件,但是在线程运行代码中引发了该事件。当您创建并启动线程等待此事件时就是这样。