7

私はこのコード行を持っています:

t.ContinueWith(_ => form.Close(), 
                  TaskScheduler.FromCurrentSynchronizationContext());

...コンパイラはこれについて次のように述べています。

警告2この呼び出しは待機されていないため、呼び出しが完了する前に現在のメソッドの実行が続行されます。呼び出しの結果に「await」演算子を適用することを検討してください。

さて、これは私が書いたコードではありませんでしたが、既存のタスクの最後に継続を追加するだけだと思いました。実際にタスク(または継続)を実行しているとは思いませんでした。確かに、タスクを変更するだけのこのプロセスは同期操作ですか?なぜ私はそれにしなければならないのawaitですか?

4

1 に答える 1

9

なぜ私はそれにしなければならないのawaitですか?

あなたはそれをする必要はありませんawait、それがそれがエラーではなく警告である理由です。ただし、asyncメソッドを使用していて、待機可能なオブジェクトを返すメソッドがある場合は、ほとんどの場合、それを無視しないでください。

通常の同期コードでは、呼び出したメソッドが完了するまで待つために特別なことをする必要はありません。各メソッド呼び出しは常にブロックされます。awaitしかし、非同期メソッドでは、完了するまで待ちたい場合は、実際にそれらを実行する必要があります。また、非同期操作が失敗して例外がスローされた場合、メソッドの結果が得られるまで(または、待機可能がである場合にawait呼び出すなど、他の方法で結果から例外を取得するまで)、そのことを知ることはできません。Wait()Task

したがって、メソッドで返される待機可能な値を無視するasyncと、コードにバグがある可能性があります。これは、警告が回避しようとしていることです。

あなたの場合、 edをContinueWith()返すことができるので、コンパイラはあなたがそれをすべきであると想定します。ただし、この場合、継続が完了するまで待ちたくないので、例外をスローしない可能性があります。したがって、この場合、警告は誤検知であり、実際にはコードの問題を示しているわけではありません。Taskawait awaitClose()

于 2012-09-23T00:16:45.200 に答える