我如何将事件定义为在一组特定情况为真时发生

本文关键字:一组 情况 事件 定义 | 更新日期: 2023-09-27 18:31:44

长话短说,我有两个布尔变量,称为FirstBool和SecondBool。我有一个程序,它使用两个委托异步运行两个方法。我正在使用Console.ReadLine()在子线程运行时保持父线程活动状态。

当第一个方法完成时,FirstBool 设置为 true。当第二个方法完成时,SecondBool 设置为 true。

长话短说,我想将我的事件定义为"FirstBoolSecondBool都是真的",并在此时关闭我的程序。我能看到的唯一选择是轮询两个布尔值,直到它们都为真,然后关闭程序,轮询很糟糕。

我的代码如下:

class Program
{
    private delegate void MyDelegate();
    private static bool FirstBool { get; set; }
    private static bool SecondBool { get; set; } 
    static void Main(string[] args)
    {
        FirstBool = false;
        SecondBool = false;
        MyDelegate firstDelegate = new MyDelegate(FirstMethod);
        MyDelegate secondDelegate = new MyDelegate(SecondMethod);
        AsyncCallback myCallback = new AsyncCallback(CallbackMethod);
        firstDelegate.BeginInvoke(myCallback, "Zip");
        secondDelegate.BeginInvoke(myCallback, "Line");
        Console.ReadLine();
    }
    private static void CallbackMethod(IAsyncResult result)
    {
        switch (result.AsyncState.ToString())
        {
            case "Zip":
                FirstBool = true;
                break;
            case "Line":
                SecondBool = true;
                break;
        }
        Console.WriteLine("Callback Method");
    }
    private static void FirstMethod()
    {
        Console.WriteLine("First Method");
    }
    private static void SecondMethod()
    {
        Console.WriteLine("Second Method");
    }
}

那么,长话短说,如何创建一个定义为"FirstBool为真,SecondBool为真"的事件,并在此事件发生时运行方法?

谢谢

我如何将事件定义为在一组特定情况为真时发生

如果您有权访问 .NET 4,则可以使用任务并行库轻松完成此操作:

var taskOne = Task.Factory.StartNew(() =>
   {
       // Do Stuff
   });
var taskTwo = Task.Factory.StartNew(() =>
   {
       // Do Other Stuff
   });
Task.WaitAll(taskOne, taskTwo);
// Quit

如果使用的是较旧版本的 .NET,则只需调用 EndInvoke 方法来等待异步调用完成:

 SomeDelegate x = SomeMethod;
 SomeDelegate y = SomeOtherMethod;
 var iar1 = x.BeginInvoke(null, null);
 var iar2 = y.BeginInvoke(null, null);
 // Program would still be executing here...
 x.EndInvoke(iar1);
 y.EndInvoke(iar2);
 // Quit

在每个布尔值的二传器中,检查它们是否都是真的。 如果是,则可以运行方法。

下面是如何执行此操作的示例:

public static object syncLock = new object();
private static bool myFirstBool;
private static bool mySecondBool;
private static bool FirstBool {
    get { return myFirstBool; }
    set {
        lock (syncLock) {
            if (value && mySecondBool) {
                CallbackMethod(null);
            }
            myFirstBool = value;
        }
    }
}
private static bool SecondBool {
    get { return mySecondBool; }
    set {
        lock (syncLock) {
            if (value && myFirstBool) {
                CallbackMethod(null);
            }
            mySecondBool = value;
        }
    }
}

这是实现目标的一种非常困难且容易出错的方法。

看看这篇文章,它将有助于以更安全,更好的方式完成您想做的事情

http://msdn.microsoft.com/en-us/library/system.threading.eventwaithandle.aspx

对于特定的应用程序,我只建议使用同步原语,如System.Threading.ManualResetEvent或 - 当您等待两个事件时 - 一个System.Threading.Semaphore。您将创建一个初始计数为零、最大计数为 2 的信号量变量。不是设置bool,而是调用Release()并在主线程中等待信号灯发出两次信号。