53393


質問のタイトル通りに非同期処理と並列処理の使い分けが知りたいです。  
質問ですがコメントでここのコードを書いてある部分のコードは非同期か並列のどちらの処理のコードか教えて欲しいです。

[code]

    class Program 
        {       
            static public async Task Threadmethod(int a,int b)
            {
                await Task.Run(() => {
                Thread.Sleep(6000);
    
                Console.WriteLine("finish");
    
                return a + b;
                //return x + y;
                });
            }
    
            static public void f()
            {
                Console.WriteLine("a");
            }
    
            static void Main(string[] args)
            {
                //このコード
                Task tt = Task.Run(()=> { Console.WriteLine("run run "); });
    
                Task t = Threadmethod(4,5);
    
                Parallel.Invoke(()=> { Console.WriteLine("aaa");
                },f);
    
                while(true)
                {
                    Console.WriteLine("main");
                    Thread.Sleep(1000);
    
                }
    
                Console.ReadKey();
            }
        }
    
[/code]


CC BY-SA 4.0
2019-03-09T23:59:06.813
53327
2019-03-13T03:48:03.873
2019-03-13T03:48:03.873
76
question
c#
非同期処理と並列処理の使い分けが知りたい。


提示サンプルがあまりに実用的でないので使わずに説明してみます。  
例えばこんなところ参照 <https://ufcpp.net/study/csharp/sp5_async.html>

  * 逐次処理＝複数の処理があるとき、順番に片づけていくこと

  * 並列処理＝複数の処理を（ほぼ）同時に行うこと

この２つとは違う概念として

  * 同期処理＝何らかの処理を開始したら、終了するまで他のことをしない処理

  * 非同期処理＝何らかの処理を開始したら、終了を待たずに次のことをする処理

質問に対する答えとしては、違う概念なので使い分けるものではありません、となるでしょう。

同期処理は理解しやすくプログラムコードも簡単ですが、非同期処理はいろいろ難しいです。その非同期処理を実装する手段の一つとして並列処理があります。今開始した処理が終わるのを待たずに別のことをする＝複数の処理が同時に走る＝並列ってことで。なので非同期処理はその本質として並列処理を内包していると言っていいでしょう。逆は真ではありません。並列処理を開始して、終了するまで待つのは同期処理です。

[c#](/questions/tagged/c%23 "'c#' のタグが付いた質問を表示") の `async` と `await`
は、非同期処理の実装の詳細を隠しておくものなので、オイラたち末端ユーザーとしてはありがたく使わせてもらうだけでOK! よっぽど興味があれば
referencesource 読んだり IL 読んだりしてもいいんですけど、そこまでいくと上級者向けメニューですよね。

参考リンク先の余談にもありますが `async`/`await`
を書いても状況によっては非同期っぽい動きをすることがあることは知っておくと吉。知らないでいるとまれにハマることがあります。「必ず待ちが入るはず」と思い込みのコードを書いたら、全く待たなかった（待つ必要がなかった）とか結構あります。


CC BY-SA 4.0
2019-03-11T05:06:26.623
53354
2019-03-11T05:06:26.623
8589
53327
answer


コメントや774RRさんが「異なる概念。比較できるものではない」と答えているのに、「違いを」と問われる理由、あなたの考えを教えてください。  
例えば、リレー。走者Aが走者Bにバトンを渡さなければ、走者Bは走り出せません。走者AとBは逐次処理され、かつ、「バトンを渡す」という引き継ぎ条件があるので、同期的に処理されなければなりません。  
しかし、AとBのレーンが異なるなら、並列処理で、非同期です。  
二人三脚の場合。AとBは並列に処理され、かつ、足をくくっていますから、同期処理です。  
プロセスAとBの処理される順番が、順に並べなければならないなら逐次処理、同時に行っても良いなら並列処理。  
プロセスAとBの進捗について、なんらかのメッセージのやりとりがあり、メッセージの到着を待つなら同期処理、待つ必要がないなら非同期処理。  
parallelで並列にした処理の内容によって、同期か非同期かは異なる


CC BY-SA 4.0
2019-03-13T03:00:29.543
53393
2019-03-13T03:00:29.543
29996
53327
answer