0

教えてください、それは意味がありますか? - コントローラ書き込み非同期メソッドでは、非同期操作がない場合、次のレコードを意味します。ASP.NET MVC非同期タスクの実行は意味がありますか?

[HttpPost] 
    public async Task<ActionResult> SendTask(TaskModel taskModel) 
    { 
     MailTask task = taskModel.BuildTask(); 

     await Task.Run(() => 
     { 
       task.Send(); // <- it is not async method 

       // bla bla bla... my other no async code 
     }); 

     return _jsonDataResult; 
    } 

意味がありますか?私はちょうどアクションを実行し、私のコード内にあります。 私は、 'await'の後に "ToListAsync()またはSaveChangesAsync()"を呼び出すと、.NET非同期操作を呼び出すという例が見え続けます。しかし、私はそれを使用しないで、代わりに私は単にTask.Run(()=> {x = 5 +5;}))非同期になるのを待って使用しますか?

答えて

1

一般にこれは意味をなさないものであり、I/O操作が含まれていない限り、操作レベルでは真に非同期ではありません。すなわち、データベース相互作用(例えば、SaveChangesAsyncまたはToListAsync)のような入出力操作は、CPUの計算よりもはるかに時間がかかるため、CPUはI/Oが完了するまでに比較的長い時間を費やします。 5 + 5を計算している間、待つことはありません。

待機中はスレッドが同期して完了するとブロックされます。一方、非同期操作はブロックしませんが、他の作業を行うように切り替えて、OSが要求の完了時に通知するようにします。そしてそこからもう一度ピックアップしてください。これは実行時のコストもかかります(コンテキスト切り替え)ので、実際のI/Oがなければ通常はあまり役に立ちません。

いくつかの現実の類推:

私は非同期操作(the speech is well worth watching)のジョンスキートのピザのメタファーが好き:非同期操作がピザを注文し、それを調製し、配信されていながらテレビを見ています。あなたのピザが到着するまで同期運転がドアで待っています。 (または:ピザを注文するのではなく、5 + 5を計算すると、その操作の途中でテレビを見ても意味がありません)

+0

したがって、Webアプリケーションでは、Asynchronousの利点は、システム操作(ToListAsync()e.t.c)の場合にのみ使用できますか?他の方法(リソースの非同期を節約するという点で)は意味がありません。 – user3418560

+0

通常はI/Oが関係している場合のみです。一言で言えば、操作を安価にするという点でリソースを節約しません。待ち時間をより効率的に使うことができます。私はそれをより明確にするために私の答えを編集しました。 –

-1

一般に、REST APIで待機するときは、非同期戻りタイプ

このような

: -

static async void ProcessDataAsync() 
    { 
    // Start the HandleFile method. 
    Task<int> task = HandleFileAsync("C:\\enable1.txt"); 

    // Control returns here before HandleFileAsync returns. 
    // ... Prompt the user. 
    Console.WriteLine("Please wait patiently " + 
     "while I do something important."); 

    // Wait for the HandleFile task to complete. 
    // ... Display its results. 
    int x = await task; 
    Console.WriteLine("Count: " + x); 
    } 
2

私はそれを使用いけない、その代わりに、それは私はTask.Run(()=> {X = 5 +5;})待って使用した場合)、それはなり非同期ですか?

これは私が「偽の非同期」と呼ぶものです。つまり、のように動作します(await edなどのタスクを返します)。実際にはという別のスレッドで動作しています。

それは意味がありますか?

いいえASP.NETでawait Task.Runが実行するのは、スレッドコンテキストスイッチが原因で、まったく効果が得られません。応答時間を遅くする理由はありません。

詳細については、私のarticle on async ASP.NETの「非同期コードは銀色の箇条書きではありません」を参照してください。

関連する問題