关于AutoResetEvent的使用

AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。

线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程
通过调用 Set 发出资源可用的信号。

调用 SetAutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止
状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。

可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态,如果初始状态为终止状态,则为 true;否则为 false

通俗的来讲只有等myResetEven.Set()成功运行后,myResetEven.WaitOne()才能够获得运行机会;Set是发信号,WaitOne是等待信号,只有发了信号,
等待的才会执行。如果不发的话,WaitOne后面的程序就永远不会执行。

定义委托线程:   

public delegate void AsyncDelegate();

 try
        {
            AsyncDelegate dlgt1 = new AsyncDelegate(GetPolicyInfo);
            IAsyncResult ar1 = dlgt1.BeginInvoke(null, null);
            AsyncDelegate dlgt2 = new AsyncDelegate(GetFDPriceInfo);
            IAsyncResult ar2 = dlgt2.BeginInvoke(null, null);
            AsyncDelegate dlgt3 = new AsyncDelegate(LiuKouQuery);
            IAsyncResult ar3 = dlgt3.BeginInvoke(null, null);
            AsyncDelegate dlgt4 = new AsyncDelegate(PolicyCoordinationQuery);
            IAsyncResult ar4 = dlgt4.BeginInvoke(null, null);
            ar1.AsyncWaitHandle.WaitOne();
            dlgt1.EndInvoke(ar1);
            ar2.AsyncWaitHandle.WaitOne();
            dlgt2.EndInvoke(ar2);
            ar3.AsyncWaitHandle.WaitOne();
            dlgt3.EndInvoke(ar3);
            ar4.AsyncWaitHandle.WaitOne();
            dlgt4.EndInvoke(ar4);
            CombinePolicyAndPrice();
        }
        catch
        {

        }
        finally
        {
            AutoResetEvent are = (AutoResetEvent)o;
            are.Set();
        }

原文地址:https://www.cnblogs.com/xingvskong11/p/AutoResetEvent.html