C#中等待其中一个事件的正确方法是什么,首先是设置AutoResetEvent还是另一个Thread结束?
等待多个等待句柄可以使用WaitHandle.WaitAny。但是Thread不是WaitHandle。
示例:
class Example
{
AutoResetEvent _stopEvent = new AutoResetEvent(false);
public void Start()
{
var handles = new WaitHandle[] { _stopEvent, Thread.CurrentThread }; //error: Thread is not WaitHandle
var t = new Thread(() =>
{
//...
int r = WaitHandle.WaitAny(handles);
switch(r) {
case 0: Console.WriteLine("Stop called"); break;
case 1: Console.WriteLine("thread ended"); break;
}
//...
});
t.SetApartmentState(ApartmentState.STA);
t.Start();
}
public void Stop()
{
_stopEvent.Set();
}
}
目前我使用此解决方法。
class Workaround
{
AutoResetEvent _stopEvent = new AutoResetEvent(false);
public void Start()
{
var stopEvent = _stopEvent;
var thread1 = Thread.CurrentThread;
var t = new Thread(() =>
{
//...
while(!stopEvent.WaitOne(100)) {
if(thread1.Join(0)) break;
}
//...
});
t.SetApartmentState(ApartmentState.STA);
t.Start();
}
public void Stop()
{
_stopEvent.Set();
}
}
我知道原生API - WaitForMultipleObjects等,但我想避免它。
代码将在库中;它在线程结束时无法显式设置事件。