2016-05-14 21 views
0

同期メソッドを呼び出すと、それはそれを使用することは理にかなっていたときに理解しようとしています。 webapi2で従来のWebサービスを呼び出すためのメソッドをたくさん用意しています。非同期メソッド非同期に新

我々は低レベルのDLL(Company.Dal.dll、Company.Biz.dll)の多くを持っているなど。 は非同期が本当にすべての方法でなければならない

質問を非同期されていないメソッドを持っていますか? 低レベルのdll(dal、bizなどのレガシーコード)を呼び出す上位レベルのdll(すべてのメソッドasync)を持つメリットはありますか?それだけで、高レベルのコンポーネント非同期なるように、残りのsyncronousを持つことで何らかの利点が

ありますか?

enter image description here

あなたが実際にawaitに何かあれば明確化 のための多くのおかげで何かいいチュートリアルはasyncを使用して、このコンセプトに

+0

は、多分それはあなたの場合は、より良いあなたを助けるでしょう非同期コードの利点と実装時期について理解していました。次に、実行している操作と使用するライブラリの制限に基づいて、メソッドから非同期または標準の同期メソッドを公開するかどうかを決定することができます。 [asyncとawaitでの非同期プログラミング](https://msdn.microsoft.com/en-us/library/mt674882.aspx) – Igor

+0

@Igorお返事ありがとうございます。私はすでに記事を読んだことがありますが、同期メソッドを呼び出す非同期メソッドを使用している場合は、確かに大雑把にはそれは価値があるのですか?その記事は私の質問 – developer9969

答えて

1

をexplaningにのみ意味があります。そうでない場合、asyncメソッドは実際には完全に同期しています(コンパイラから警告が出ます)。この場合

asyncは、唯一の欠点を任意の利点を持っていない:コードはより複雑かつ非効率的です。

+0

に返事がありません。あなたが何を言っているのか理解しています。もし私が非同期でやっていないなら、何の利益もないと言っていますか?したがって、dll1.method1Asyncでdll2.Method1NotAsyncを呼び出すと、非同期メソッドから終了する呼び出しを待機するブロックが存在するため、何のメリットもありません。 – developer9969

+0

@ developer9969正確に。 – svick

0

スレッドは、一度に1つのことを行うことができます。プロシージャによってスレッドがビジー状態になっても、非同期にすることは意味がありません。

あなたの手順では、スレッドが終了するのを何か他のもののために待機しなければならない期間がある場合しかし、あなたのスレッドではなく、有益な何かをするかもしれません。そのような状況では、非同期待機が有用になります。

Eric lippert once explained async-await with a restaurant metaphor(非同期のawaitのためのページで検索してください)。パンを焼くまで待たなければならない料理人がいれば、この料理は卵を調理するような何かをすることができ、「何か他のもの」が終わったときにトースターに戻ったり、卵が調理されるのを待っている。

ソフトウェアでは、何かが完了するのを待つ以外は、スレッドが通常は何もしません。ディスクを読み書きしたり、ネットワークを介してデータを送受信したりします。通常、非同期バージョンも見つけることができます非同期バージョンのプロシージャとして使用できます。例えば、Stream、TextReader、WebClientなどのクラスを参照してください。

スレッドが多くの計算をしなければならない場合は、スレッドが何もしない瞬間がないので、非同期関数を作成すると便利ではありません。あなたのスレッドは他のことをする時間がありませんので、待ってください。計算が行われている間、あなたのスレッドが有益な何かをすることができれば

しかし、あなたのスレッドは、他の有用なものをやっている間に別のスレッドが、これらの計算を行うせる考えてみます。

private async Task<int> MyLengthyProcedure(...) 
{ 
    Task<int> calculationTask = Task.Run(() => DoCalculations(...)); 
    // while one of the threads is doing the calculations, 
    // your thread could do other useful things: 
    int i = DoOtherCalculations(); 

    // or if there are calculations that could be performed 
    // by separate threads simultaneously, start a second task 
    Task<int> otherCalculationTask = Task.Run(() => DoEvenMoreCalculations(...)); 

    // now two threads are doing calculations. This thread is still free to 
    // do other things 

    // after a while you need the result of both calculations: 
    await Task.WhenAll(new Task[] {calculationTask, otherCalculationTask}); 

    // the int return value of DoCalculations and DoOtherCalculations are in 
    // the Result property of the task object: 
    int j = calculationTask.Result; 
    int k = otherCalculationTask.Result; 
    return i + j + k; 
; 
+0

あなたの時間とreply.digesting何を言っているのか感謝します。私が理解しようとしているのはdifferent.Ifあなたが非同期メソッドを持っていて、メソッド "DAL"または "BLL"非同期、私の理解に私はasyn呼び出しをすべてしていないが、呼び出しが私の非ASYNC DLL METHODに達するとスレッドをブロックしています。これは正しいですか? – developer9969

関連する問題