2017-01-16 26 views
3

私は一般的にWebサーバーをプログラミングしていますが、まずはタスクを返すメソッドが連続していなければならないと思っていました。どのようにC#は非同期処理を処理しますか?

最近、私はそのような何かないWPFコード、見た:イベントハンドラで呼び出され

public async void Execute(object parameter) 
    { 
     await ExecuteAsync(parameter); 
    } 

を。 UIは反応があるようですので、うまくいくと思います。どのように機能するのですか?これはどのようにaspnetに変換されますか?

答えて

6

Async voidは、イベントハンドラ/デリゲートの比較可能性にのみ使用されます。 Executeはイベントコールバックで、おそらくDelegateCommandまたはそれに類するものです。

Taskを返した関数があったにもかかわらず、呼び出し元がその返されたタスクにawaitを呼び出さなかった場合と同じように扱われます。 ASP.NETで

あなたがHostingEnviorment.QueueBackgroundWorkItemを使用し、非同期のボイドを使用しないようにし、代わりにTask<ActionResult>を返すメソッドを公開するコントローラを使用する可能性がある、またはあなたがasync voidを使用していた状況でPage.RegisterAsyncTaskに包まれている関数を使用して通常のデスクトッププログラミングでは

public void Page_Load(object sender, EventArgs e) 
{ 
    RegisterAsyncTask(new PageAsyncTask(LoadSomeData)); 
} 
+0

私はタスクを待っていないとどうなりますか? – user2029276

+1

@ user2029276 asp.netサブシステムはタスクについて知りませんし、機能が完了する前にウェブサイトのアプリドメインを解読して、機能が失われて完了していないと言った作業を引き起こします。あなたがWPFでこれを取り除くことができる理由は、AppDomainが動作している限り、ユーザーがプログラムを使用している間にAppDomainが無作為に解体されることはないということです。 asp.netサイト上の非アクティブなユーザーがAppDomainを切断して、それが起こることに気付かないことさえあります。 –

7

私はasync void方法がどのように動作するかを説明 - と、なぜ彼らは避けるべきである - 私のBest Practices in Asynchronous Programming記事で。

async voidは、例外を除いてasync Taskと同じセマンティクスを持ちます。 async voidメソッドは、メソッドの先頭に現在のSynchronizationContextをキャプチャし、そのメソッドからの例外はキャプチャされたコンテキストで直接キャプチャされ、発生します。最も一般的なシナリオでは、アプリケーションレベルの例外が発生し、通常はクラッシュします。いくつかの人々はasync voidの方法を "火と忘れ"と呼んでいますが、その例外的な行動のために、私は "火事とかクラッシュ"を好む。 :)

「非同期無効化」は一般的なガイドラインであり、イベントハンドラ(または、ICommand.Execute実装のような論理的にイベントハンドラであるアイテム)を除いて、一般的なガイドラインです。

どのように動作しますか?これはどのようにaspnetに変換されますか?

他のasyncメソッドと同じように機能します。主なプラットフォームの違いは、asyncメソッドが完了したときにUIスレッドを知る必要がないことです。 ASP.NETは要求を送信するタイミングを知るためにそれを知る必要がありますが、UIはasyncメソッドが完了した時点を知る必要はありません。だからasync voidが機能する。 コードは通常となりますので、それが完了したらは知る必要があります。

関連する問題