2016-06-30 9 views
0

私はそれを呼び出すと非同期的に '非同期タスク'メソッドを使用するメソッドを実行することができたと思うが、ブロックされ、実際には同期的に実行されます。'async Task'キーワードを非同期的に使用するメソッドを実行するにはどうすればよいですか?

static void Main(string[] args) 
    { 
     asyncTest();// use asyncTest.Wait() help nothing. 
     Console.ReadKey(); 
    } 

    static async Task asyncTest() 
    { 
     Console.WriteLine("before init task second " + DateTime.Now.Second); 
     var t1 = getInt1S();// I supposed it to run background,but it blocked 
     var t3 = getInt3S(); 
     //var await1 = await t1;//this line just no use, run quickly 
     //var await3 = await t3;//this line just no use, run quickly 
     Console.WriteLine("after init task second " + DateTime.Now.Second); 
    } 

    static async Task<int> getInt1S() 
    { 
     Console.WriteLine("getInt1S" + DateTime.Now.Second); 
     Task.Delay(1000).Wait(); 
     return 1; 
    } 

    static async Task<int> getInt3S() 
    { 
     Console.WriteLine("getInt3S" + DateTime.Now.Second); 
     Thread.Sleep(3000); 
     return 3; 
    } 

のような出力:

before init task second 21 
getInt1S 21 
getInt3S 22 
after init task second 25 

はなぜ 'getInt1S()' と 'getInt3Sを待つには、()' すべて同期的に実行しますか?以下のようにコーディングする方法はあります:

var a = methodSync();//method define like: async Task<T> methodSync() 
Console.Write("");//do something during processing the methodSync 
T b = await a; 

私は私の「T1」と「T2」はで非同期に実行させるためにどのようConsoleApp.Justに「)(非同期methodSync」を使用する方法を見つけるつもりはありません'asyncTest()'。

私はのawait /非同期に取り組んでいますので、私は何かを見つけたいが '=新しいタスク(()=> {返す1;})のvar A' と異なる

コールasyncTestの方法を実行します()問題?または私が逃した何か?

私を助けることができる人は誰ですか?私のエラーを指摘する。

ありがとうございました。

+1

コンパイラは 'await'を使用しないので、' async'メソッドが同期して実行されることを警告します。私は参考になるかもしれない[非同期チュートリアル](http://blog.stephencleary.com/2012/02/async-and-await.html)を持っています。 –

+0

[コンソールアプリケーションの[Main]メソッドで 'async'修飾子を指定できません](http://stackoverflow.com/questions/9208921/cant-specify-the-async-modifier-on-コンソールメソッドのメインメソッド) – Eris

答えて

2

すべての非同期メソッドは、最初のawait命令まで同期して実行されます。

次に、待ち受け可能なものが完了すると、次のawait命令またはメソッドの終了まで同期的に実行を継続します。

完了していない待ち時間に達すると、制御は呼び出しメソッドに返され、Taskが返されます。このメソッドは、非同期メソッドのすべての待ち時間が完了し、メソッドの終了に達すると完了します。

このコンパイラ機能の目的は、(同期ではなく)順番に実行されるコードを簡単に生成して、あなたが見ているものを簡単に生成することです。

+0

私はそれを見つける。Task.Delay(1000).Wait()とThread.Sleep(3000)を待ってTask.Delay(1000)を置き換えるgetInt1Sを実行します()とgetInt1S()を非同期に実行します。タスクが作成されるたびに、システムはすべてのコードを同期して実行します。await.Task creatorですべてのコードを同期して実行するのでなければ、タスクは同期して実行されます。 –

+1

'await'は' Task'を作成しません。 –

関連する問題