best practiceは/待って(あなたが本当に、本当に方法2が完了するのを待っている方法1を気にしない限り)、「すべての道をダウン」非同期を使用することです。
Task.Wait(または同様の構造体)と非同期コードを混在させることはできますが、デッドロックにつながる可能性があるのでbad ideaです。
ここに最善のことはあまりにも非同期(async)メソッド1を作り、他の人が示されているように、次のようになります。あなたは方法1があまりにもタスクを返すようにする必要があります
public async Task Method1() {
while (statement1) {
await Method2(i);
// ...
}
注そう、あなたがそれを待つことができないので、 : - あなただけ行うことができます
public async Task Method2
これは(そのことについて、あるいは別の方法で)あなたが最初の場所でasyncを指定するために提供のサンプルコードには理由がないので、けれどもXY Problemの場合もあります代わりにThread.Sleep。また、あなたが私たちに示したことに基づいて、どちらの方法でも2秒間遅れるので、 "if"ステートメントは無意味です。より実用的なコードサンプルを表示することができれば、あなたがしようとしていることをよりよく理解できるので、ここではasyncが適切な解決法であるかどうかをお勧めできます。
最後に、async/awaitの目的の1つは、UIを「ハングする」ことなくファイルをダウンロードするなど、結果を待っている間に呼び出しスレッドが他の作業を行うことができるようにすることです。私は、人々が本質的に目的を取り除く方法で非同期/待機を使用する多くのケースを見てきました。たとえば:
static void Main(string[] args) {
// This is a terrible thing to do but it's for illustration purposes
Task task = Method1();
task.Wait();
// Some other work
}
private static async Task Method1() {
await Method2();
// Some other work
}
private static async Task Method2() {
await Method3();
// Some other work
}
private static async Task Method3() {
await Task.Delay(1000);
}
は、これはかなりダムイラスト、許可されているが、それはとにかく、各アクションを順番にやっているので、この場合には非同期/のawaitは完全に無意味です。
a)Method1はMethod2が終了するまで待つ必要がありますか?b)Method1を非同期にすることはできますか? c)非同期voidを使用せず、非同期タスクを使用してください。 – EJoshuaS
[MCVE]を投稿してください - 「Method1のwhileステートメントは最終的に」変化しています。 –
'async'は"バックグラウンドで実行する "という意味ではありません。 「後でこれを実行し、私が待つことができるという約束を私に与える」という意味です。まさにあなたが達成しようとしているものに応じて、これを書き換えるための複数のアプローチが可能です。 'Method2' asyncがなぜ始まるのはなぜですか? –