在C#中等待AutoResetEvent或Thread(已结束)

时间:2018-03-28 12:13:51

标签: c# multithreading thread-synchronization

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等,但我想避免它。

代码将在库中;它在线程结束时无法显式设置事件。

0 个答案:

没有答案