首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当一组特定的情况为真时,我如何定义一个事件发生?

当一组特定的情况为真时,我如何定义一个事件发生?
EN

Stack Overflow用户
提问于 2012-04-21 00:59:19
回答 4查看 68关注 0票数 0

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

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

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

我的代码如下:

代码语言:javascript
运行
复制
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为真“的事件,并在该事件发生时运行方法?

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-21 01:09:41

如果您可以访问.NET 4,那么您可以使用任务并行库轻松实现这一点:

代码语言:javascript
运行
复制
var taskOne = Task.Factory.StartNew(() =>
   {
       // Do Stuff
   });

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

Task.WaitAll(taskOne, taskTwo);

// Quit

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

代码语言:javascript
运行
复制
 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
票数 3
EN

Stack Overflow用户

发布于 2012-04-21 01:02:49

在每个布尔值的setter中,检查它们是否都为真。如果是,你就可以运行你的方法了。

下面是一个如何做到这一点的示例:

代码语言:javascript
运行
复制
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;
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2012-04-21 01:04:04

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

看看这篇文章,它将帮助你以更安全、更好的方式完成你想要做的事情。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10250416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档