BT

いかにあらゆるものを待つか!

| 作者: Jonathan Allen フォローする 526 人のフォロワー , 翻訳者 編集部N フォローする 0 人のフォロワー 投稿日 2012年12月25日. 推定読書時間: 2 分 |

原文(投稿日:2012/12/18)へのリンク

 

Lucian Wischik氏が公開している一連のブログ記事は、アニメーションの終了を待つことから、コマンドラインプログラムの結果をキャプチャするまでの、広範囲の状況でどうのようにAwaitを使用できるかを示している。

基本パターンは彼の記事でいかにストーリーボードをawaitするかに説明されている。その中核は TaskCompletionSourceである。ストーリーボードがその完了イベントを点火すると、それに関連付けられたイベントハンドラーは、 TaskCompletionSourceを使って Taskに結果を渡す。

このお陰で、シンタックス“Await storyboard1.PlayAsync()”このお陰で、シンタックス“Await storyboard1” で良く、GetAwaiterという拡張メソッドを作ることができ、それに TaskAwaiterを変えさせることができる。コンパイラーはこの名前のメソッドを探し、適宜コードを書き換えてくれる。

このイベントハンドラーベースのアプローチにもっと複雑な例は、How to await a MediaElementにある。これは2つの関数OpenAsyncと PlayAsyncを作成する。いかにエラーハンドリングが綺麗な方法でサポートできるかが説明されている。

Lucian氏のRunCommandLineAsyncは、コマンドラインプログラムから標準出力と標準エラーのストリームの両方を読むことをサポートしている。前述の2つのストリームと入力ストリームとのやり取りのために、このようにするのは最初、思う程簡単ではない。氏はこのためにいかにマルチタスクが使われているかを説明している

“RedirectStandardInput/Output/Error”の正確な動きは、起動したプロセスの内部詳細に依存する。我々が確実に言えるのは、(1)プロセスは、その StandardInputをクローズするまで終わらないだろう(2)我々は StandardInputにそれ以上のデータを書き込める前に、 StandardOutput/StandardErrorからデータを読まなければならないだろう(3) StandardOutput/StandardErrorからもっとデータを読みことが出来る前に、StandardInputにもっとデータを書き込まなければならないだろう。このような制約は、3つのタスク “tin/tout/terr”は全て同時に起動されなければならず、それからTask.WhenAll()を使って待たなければならない。

いかにコンパイラーで Await と GetAwaiterがやり取りするか、もっと知りたければ Stephen Toub氏の記事何でも待つを読むといい。

 

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

特集コンテンツ一覧

ASP.NET Core - シンプルの力

Chris Klug 2018年6月4日 午前3時26分

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT