32753


お世話になっております。  
C#にて、複数スレッド間で情報を共有するにはどのようなものがありますでしょうか？  
具体的には、一方のスレッドでエラーが発生したという情報をもう一方のスレッドで検知をしたいです。  
両スレッドで見れるフラグとしてグローバル変数を用意するというくらいは分かるのですが、他によりスマートな方法はありますでしょうか？

よろしくお願いします。


CC BY-SA 3.0
2017-02-17T09:58:47.057
32749
2017-02-18T13:15:05.637
2017-02-18T13:15:05.637
76
20665
question
c# .net マルチスレッド
スレッド間での情報共有について


[Async および Await を使用した非同期プログラミング](https://msdn.microsoft.com/ja-
jp/library/hh191443\(v=vs.110\).aspx)を参照してほしいのですが、C#は言語仕様として非同期プログラミングをサポートしています。  
これを使用しますと、ネットワークの送受信処理などの実行指示を行い、その完了を待つ間に別の処理を続行できます。この方式の利点は、複数のスレッドを使用してはいますが、実行の流れは１つしかないため、質問にあるようなスレッド間で情報を共有する必要がなくなることです。

というわけでマルチスレッドについて悩まれているのでしたら、非同期プログラミングをお勧めします。


CC BY-SA 3.0
2017-02-17T13:27:43.550
32751
2017-02-17T13:27:43.550
4236
32749
answer


2個のスレッドの処理でデータを1個の保持するクラスのインスタンスを参照すれば各スレッドの情報を共有することが出来ますし、`static`変数を使う場合に比べて拡張性が担保できます。

[code]

    class HogeContext
    {
        bool fugaFailed;
        bool piyoFailed;
    
        public void Fuga()
        {
            try
            {
                // 並列処理１
            }
            catch
            {
                fugaFailed = true;
                throw;
            }
        }
        public void Piyo()
        {
            try
            {
                // 並列処理２
            }
            catch
            {
                piyoFailed = true;
                throw;
            }
        }
    }
    
    // 並列処理の起動
    var context = new HogeContext();
    new Thread(context.Fuga).Start();
    new Thread(context.Piyo).Start();
    
[/code]

上記では`Thread.Start`を使用していますが、これは`Task`その他の非同期処理技法でも適用できます。また簡単のため処理とデータを同じクラスに記述していますが、一般的には処理自体は他のクラスに定義しパラメーターとしてコンテキストを渡すことが多いと思います。


CC BY-SA 3.0
2017-02-17T14:06:34.380
32753
2017-02-17T14:06:34.380
5750
32749
answer