【发布时间】:2011-02-15 22:32:31
【问题描述】:
我有以下问题:
我想检查 (C#) 线程是否已完成执行,即线程方法是否已返回。我现在要做的是调用Thread.Join(1),但这会产生 1 毫秒的延迟。有什么方法可以简单地检查线程是否已完成。检查Thread.ThreadState 似乎太麻烦了。
【问题讨论】:
标签: c# multithreading thread-state
我有以下问题:
我想检查 (C#) 线程是否已完成执行,即线程方法是否已返回。我现在要做的是调用Thread.Join(1),但这会产生 1 毫秒的延迟。有什么方法可以简单地检查线程是否已完成。检查Thread.ThreadState 似乎太麻烦了。
【问题讨论】:
标签: c# multithreading thread-state
如果您不想通过等待/检查其他正在运行的线程完成来阻塞当前线程,您可以 像这样实现回调方法。
Action onCompleted = () =>
{
//On complete action
};
var thread = new Thread(
() =>
{
try
{
// Do your work
}
finally
{
onCompleted();
}
});
thread.Start();
如果你正在处理不支持跨线程操作的控件,那么你必须调用回调方法
this.Invoke(onCompleted);
【讨论】:
使用Thread.Join(TimeSpan.Zero)它不会阻塞调用者,并返回一个值指示线程是否完成了它的工作。顺便说一句,这也是测试所有WaitHandle 类的标准方法。
【讨论】:
使用Thread.IsAlive 标志。这是为了给线程状态。
【讨论】:
【讨论】:
我广泛使用 IsAlive,除非我想阻止(调用线程的)当前执行,在这种情况下,我只调用 Join() 而不带参数。现在,请注意,如果目标线程由于某种原因尚未真正开始执行,IsAlive 可能会返回 false。
卡洛斯·梅里赫。
【讨论】:
这取决于你想如何使用它。使用 Join 是一种方法。另一种方法是让线程通过使用事件来通知线程的调用者。例如,当您的图形用户界面 (GUI) 线程调用一个运行了一段时间并需要在完成时更新 GUI 的进程时,您可以使用该事件来执行此操作。该网站让您了解如何处理事件:
http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx
请记住,这将导致跨线程操作,如果您想从另一个线程更新 GUI,则必须使用要更新的控件的 Invoke 方法。
【讨论】:
对于一个线程,你有myThread.IsAlive 属性。如果线程方法返回或线程被中止,则为 false。
【讨论】:
您可以在线程完成后触发一个事件并订阅它。
您也可以不带任何参数地调用Thread.Join():
阻塞调用线程直到线程终止,同时继续执行标准 COM 和 SendMessage 泵送。
阻塞调用线程,直到线程终止或指定时间过去,同时继续执行标准 COM 和 SendMessage 泵送。
在这种情况下,指定的时间是 1 毫秒。
【讨论】:
t1 是您要加入的线程:if (Thread.CurrentThread != t1) t1.Join();