2016-11-02 9 views
0

私は、同期する必要がない長時間実行されるプロセスを高速化する方法を理解しようとしています。 「複数のクエリ結果」をダッシュ​​ボードに表示すると考えてください。私はDIを持つ.Net CoreとIOCを使用しています。IOCを使用してasp.net mvcコアコントローラ経由で非同期呼び出し

私は概要()メソッドからIRequirementsServiceインタフェースを介してRequirementsService.Fire()メソッドを呼び出したいです。目的は、各メソッドコールのロジックを他のメソッドと同時に実行できるように、各Fire()メソッドを起動することです。結果を発信者に返す必要があります。

以下の解決策は、まだ同期を実行します...私は、構文の問題を持っていると思うが、VSはちょうどそれが概要()メソッドから同期的に実行されることを私に警告し、何でbawkingされていません。非同期的な性質を持っているコントローラ方法を作る

は//コントローラ

public async Task<ActionResult> Overview() 
    { 

     //_requirement service is injected at controller constructor which I removed for brevity. 

     var fireOne = await _requirement.Fire(10000, "Fire 1"); 

     var fireTwo = await _requirement.Fire(5000, "Fire 2"); 

     var fireThree = await _requirement.Fire(1000, "Fire 3");    

     return View(model); 
    } 

//インタフェース

public interface IRequirementsService 
{ 
    Task<int> Fire(int number, string fireCount);   
} 

//サービス

public class RequirementsService : IRequirementsService 
{ 

    ... 

    public async Task<int> Fire(int number, string fireCount) 
    { 
     int TimeOne = 0; 

     Thread.Sleep(10000 + number); 

     TimeOne = (10000 + number)/1000; 

     Debug.WriteLine(fireCount + TimeOne); 

     return TimeOne; 
    } 
} 

答えて

0

advisibleないではありませんどのように非同期メソッドと櫛を呼び出すことができますお使いのコントローラでINEそれら

public async Task<ActionResult> Overview() 
    { 

     //_requirement service is injected at controller constructor which I removed for brevity. 

     var fireOne = await _requirement.Fire(10000, "Fire 1"); 

     var fireTwo = await _requirement.Fire(5000, "Fire 2"); 

     var fireThree = await _requirement.Fire(1000, "Fire 3");    

     ActionResult[] result = await Task.WhenAll(fireOne , fireTwo,fireThree); 

     return View(model); 
    } 

以下のようにWhenAll方法を使用して、私はこのについての詳細は、このlinkであなたをお勧めします。

+2

なぜ非同期コントローラメソッドを使用することをお勧めしません。また、非同期呼び出しが行われた場合、彼はもはや – Mathew

+0

を待つことはできません。つまり、呼び出し元のメソッドも非同期でなければなりませんか? – Aravind

+0

ストレートコンパイラエラー: 'await'演算子は、非同期メソッド内でのみ使用できます。 – Mathew

1

あなたが行うことができ、次のものをブロックし、順次、各コールを持っているあなたの火の方法を3回実行しないようにしたい場合:

Task.WaitAll(_requirement.Fire(10000, "Fire 1"), 
    _requirement.Fire(5000, "Fire 2"), 
    _requirement.Fire(1000, "Fire 3")) 

また、ブロックを回避するために代わりのThread.sleepのTask.Delayを使用スレッド。

関連する問題