0

簡単に言えば、FirstBool と SecondBool という 2 つのブール変数があります。2 つのデリゲートを使用して 2 つのメソッドを非同期的に実行するプログラムがあります。Console.ReadLine()子スレッドの実行中に親スレッドを維持するために使用しています。

最初のメソッドが完了すると、FirstBool が true に設定されます。2 番目のメソッドが完了すると、SecondBool が true に設定されます。

簡単に言えば、イベントを「両方とも真」FirstBoolと定義し、この時点でプログラムを終了したいと思います。SecondBoolこれに代わる唯一の方法は、両方のブール値が真になるまでポーリングしてからプログラムを閉じることです。ポーリングは最悪です。

私のコードは以下の通りです:

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このイベントの発生に対してメソッドを実行するにはどうすればよいですか?

ありがとう

4

4 に答える 4

3

.NET 4 にアクセスできる場合は、Task Parallel Library を使用してこれを非常に簡単に実現できます。

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
于 2012-04-20T17:09:40.810 に答える
1

それはあなたの目標を達成するための非常に困難でエラーが発生しやすい方法です。

この記事を見てください、それはあなたがはるかに安全でより良い方法でやりたいことを達成するのに役立ちます

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

于 2012-04-20T17:04:04.410 に答える
1

各ブール値のセッターで、両方が true になるかどうかを確認します。そうであれば、メソッドを実行できます。

これを行う方法の例を次に示します。

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;
        }
    }
}
于 2012-04-20T17:02:48.607 に答える
0

特定のアプリケーションについては、 or のような同期プリミティブを使用することを強くお勧めしSystem.Threading.ManualResetEventます - 2 つのイベントを待つとき - a System.Threading.Semaphore。初期カウントが 0 で最大カウントが 2 のセマフォ変数を作成します。a を設定する代わりにboolを呼び出しRelease()、メイン スレッドでセマフォが 2 回通知されるのを待ちます。

于 2012-04-20T17:12:47.797 に答える