1

Task で拡張メソッド GetAwaiter を提供することにより、.Net 4.0 で独自の TaskAwaiter を作成できますが、.Net 4.5 でコードを実行する場合、これは不可能です。

.Net 4.5 の Task クラスには GetAwaiter というメソッドがあり、私の拡張メソッドは決して呼び出されません。


私の 1 つのコメント: 別のクラス (Task ではない) でカスタム awaiter を作成できますが、非同期メソッドは Task または void のみを返すことができ、すべてのタスク/非同期メソッド呼び出しをラップすることは実用的/エレガントではありません。

私の2つのコメント:タスクが作成された(または待機された)ときにデータを自動的に保存し、同期コンテキストを変更せずに継続メソッドでこのデータを取得する必要があります。

私の 3 コメント: .Net 4.0 と私のカスタム TaskAwaiter では、すべてが期待どおりに機能します。

4

1 に答える 1

3

これはできません。カスタム awaiter は、カスタム型を対象としています (その場合でも、通常はもっと良い方法があります)。Task1 つの代替方法は、動作方法と同様に、の拡張メソッドを使用することConfigureAwaitです。

ローカル データをそのまま使用する場合は、ラムダ変数キャプチャを使用します。

「環境」データを実行したい場合は、 と を使用できCallContext.LogicalSetDataますCallContext.LogicalGetData。ただし、そこには不変データのみを格納する必要があり、そのソリューションは.NET 4.5 でのみ機能します。のブログに詳細があります。

于 2013-09-12T13:41:53.120 に答える