2016-12-12 21 views
-6

現在のメソッドから非同期メソッドを呼び出すのが困難です。 はこのような何かやろうとしている。別のメソッドから非同期メソッドを呼び出す方法

int i; 
public void Method1() { 
    while (statement1) { 
     ~code~ 
     Method2(i); 
    } 
    while (statement2) { 
     ~code~ 
     Method2(i); 
    } 
} 

public async void Method2(int i) { 
    if(statement){ 
     ~code~ 
     await Task.Delay(2000); 
    } 
    else 
    { 
     ~code~ 
     await Task.Delay(2000); 
    } 
} 

だから私は(pictureboxesで画像を変更する別の方法を使用しています)基本的にMethod2が流れを制御するための方法になりたいが、私はそれを動作させることはできませんが、いつ何も遅らせることはありません。誰かが私が間違っていることを知っていますか?最終的に文をwhile Method2変更Method1の。

+0

a)Method1はMethod2が終了するまで待つ必要がありますか?b)Method1を非同期にすることはできますか? c)非同期voidを使用せず、非同期タスクを使用してください。 – EJoshuaS

+1

[MCVE]を投稿してください - 「Method1のwhileステートメントは最終的に」変化しています。 –

+0

'async'は"バックグラウンドで実行する "という意味ではありません。 「後でこれを実行し、私が待つことができるという約束を私に与える」という意味です。まさにあなたが達成しようとしているものに応じて、これを書き換えるための複数のアプローチが可能です。 'Method2' asyncがなぜ始まるのはなぜですか? –

答えて

0

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は完全に無意味です。

+0

私が言ったように、Method2は、アニメーションやピクチャボックス間の変更に使用されます。どちらの方法でも遅延が欲しいですが、画像を変更する "方法"は方法2のifで定義されています。あまりにも多くのコードがあるので、私はあなたに混乱させたくありません。しかし、downvotesを理解することはできません。 – supItsMe

+0

@supItsMe私はdownvoteをしませんでしたが、最初は非同期をやっている理由は元の質問からは分かりませんので、明確にするために質問自体にその情報を入れると役に立つでしょう。質問自体の中で達成しようとしていることの何らかの説明を含む)。 – EJoshuaS

0

あなたはMethod1もasyncronous作り、Method2コールのためのオペレータを待つ追加する必要があります:あなたには、いくつかの理由でsyncronousするメソッド1が必要な場合は、方法2から返されたタスクの待ちを()を呼び出す必要があり

public async Task Method1() { 
    while (statement1) { 
     ~code~ 
     await Method2(i); 
    } 
    while (statement2) { 
     ~code~ 
     await Method2(i); 
    } 
} 

public async Task Method2(int i) { 
    if(statement){ 
     ~code~ 
     await Task.Delay(2000); 
    } 
    else 
    { 
     ~code~ 
     await Task.Delay(2000); 
    } 
} 

。しかし、それは悪い習慣とみなされます。なぜなら、あなたは.NETスレッドプールの利点を失っているからです。方法2に後者を待つことができるようにする別の方法は戻らなければならないため

+0

"voidメソッドを待つことはできません"。 – supItsMe

+0

Method2()の戻り値の型をTaskに変更します。public async Task Method2(int i) – CodeFuller

+0

Method1を実行し続けるためにMethod2で何かを返さなければなりませんか? また、Method2でグローバルデータを変更できますか? – supItsMe

0

リターンタスクまたはタスクの種類(及びボイドず)を有する:

public async Task Method2(int i) { 
if(statement){ 
    ~code~ 
    await Task.Delay(2000); 
} 
else 
{ 
    ~code~ 
    await Task.Delay(2000); 
} 

方法1は、次に、非同期としてマークされ、方法2を待機しなければならない。

非同期のため
public async void Method1() { 
while (statement1) { 
    ~code~ 
    await Method2(i); 
} 
while (statement2) { 
    ~code~ 
    await Method2(i); 
} 
} 
関連する問題