非同期コードが非同期で実行されないのはなぜですか?

Avrohom Yisroel

警告私はasync / awaitの完全な初心者なので、おそらくこれを完全に誤解しています!

私はこれがどのように機能するかを理解しようとしており、WPFウィンドウのビューで簡単なコードを試しました。ボタンクリックイベントハンドラーを追加し、次のようにいくつかの同期メソッドと非同期メソッドを追加しました...

public partial class MainWindow {
  private Random _r = new Random(DateTime.Now.Millisecond);

  public MainWindow() {
    InitializeComponent();
  }

  private async void Bleah_Click(object sender, RoutedEventArgs e) {
    LstMessages.Items.Clear();
    AddToMsg("Starting...");
    DoSyncStuff();
    await DoStuffAsync();
    DoMoreStuffSync();
    AddToMsg("Done");
  }

  private void DoSyncStuff() {
    int delay = _r.Next(500, 1500);
    AddToMsg("DoSyncStuff - waiting for " + delay + "ms");
    Thread.Sleep(delay);
    AddToMsg("DoSyncStuff - finished");
  }

  private void DoMoreStuffSync() {
    int delay = _r.Next(500, 1500);
    AddToMsg("DoMoreStuffSync - waiting for " + delay + "ms");
    Thread.Sleep(delay);
    AddToMsg("DoMoreStuffSync - finished");
  }

  private async Task DoStuffAsync() {
    await Task.Run(() => {
      int delay = _r.Next(500, 1500);
      AddToMsg("DoStuffAsync - waiting for " + delay + "ms");
      Thread.Sleep(delay);
      AddToMsg("DoStuffAsync - finished");
    });
  }

  private void AddToMsg(string msg) {
    Dispatcher.BeginInvoke(
      new Action(() => { LstMessages.Items.Add(DateTime.Now.ToString("HH:mm:ss.fff") + " - " + msg); }));
  }

LstMessages ウィンドウ上のリストボックスです。

ボタンをクリックすると、各遅延の長さに関係なく、3つのメソッドが常に呼び出した順序で実行されていることがわかります。

私は明らかにこのようなものがどのように機能するかを誤解していますが、数時間読んで、コードのバリエーションをたくさん試した後、期待どおりに機能させることができません。

私がここで間違ったことを誰かが明確にできますか?

クリス

このアプローチを試してください。非同期メソッドを開始したようですが、UIスレッドですぐに待機しています。

private async void Bleah_Click(object sender, RoutedEventArgs e) 
{
    LstMessages.Items.Clear();
    AddToMsg("Starting...");
    DoSyncStuff();
    Task t = DoStuffAsync();
    DoMoreStuffSync();
    await t;
    AddToMsg("Done");
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

非同期プログラミング、コードが実行されないのはなぜですか

分類Dev

Kotlin-コルーチンスコープ、非同期が実行されないのはなぜですか?

分類Dev

Spring @Async Beanメソッドが非同期で実行されないのはなぜですか?

分類Dev

forループで非同期しても実行時間が改善されないのはなぜですか?

分類Dev

この非同期関数が同期して実行されているのはなぜですか?

分類Dev

この非同期コードが停止しないのはなぜですか?

分類Dev

コールバック付きの関数が非同期関数内で実行されないのはなぜですか?

分類Dev

非同期タスクが正しく実行されないのはなぜですか?

分類Dev

このコードは非同期で実行されていますか?

分類Dev

非同期関数だけが非同期コードで生成できるのはなぜですか?

分類Dev

非同期関数で前の.thenの後に実行されないのはなぜですか?

分類Dev

実装するインターフェースが非同期の場合、「この非同期メソッドには「await」演算子がなく、同期的に実行されます」という警告を抑制するにはどうすればよいですか?

分類Dev

非同期コードが同期よりもはるかに高速であると見なされるのはなぜですか?

分類Dev

この非同期コードが失敗することがあり、観察されない場合にのみ失敗するのはなぜですか?

分類Dev

コードは機能しますが、非同期ではなく同期的に実行されているようです

分類Dev

ドキュメントの作成と更新時にマングースが非同期で実行されるのはなぜですか?

分類Dev

SmtpClient.SendAsyncが非同期でないのはなぜですか?

分類Dev

関数内で変数を変更した後、変数が変更されないのはなぜですか?-非同期コードリファレンス

分類Dev

非同期のキャッチがコードの起動を待たないのはなぜですか?

分類Dev

setTimeoutを使用する同期コードがJavaScriptで非同期に動作するのはなぜですか?

分類Dev

この単純な非同期--promise--reduceコードが機能しているのはなぜですか?

分類Dev

この非同期メソッドにコンパイルエラーがないのはなぜですか?

分類Dev

この非同期コードで同じ結果が繰り返し得られるのはなぜですか?

分類Dev

呼び出し元メソッドの次の行が実行される前に非同期メソッドが終了するのはなぜですか?

分類Dev

非同期モジュールを使用しているにもかかわらず、これらの関数が非同期で実行されるのはなぜですか

分類Dev

setStateは非同期なので、コールバックキューを介して実行されますか?

分類Dev

なぜC ++非同期は未来なしで順次実行されるのですか?

分類Dev

Promise.allが2つの関数を非同期で実行しないのはなぜですか?

分類Dev

IAsyncEnumerableを返す非同期メソッドが構造体ではなくクラスとして実装されているのはなぜですか?

Related 関連記事

  1. 1

    非同期プログラミング、コードが実行されないのはなぜですか

  2. 2

    Kotlin-コルーチンスコープ、非同期が実行されないのはなぜですか?

  3. 3

    Spring @Async Beanメソッドが非同期で実行されないのはなぜですか?

  4. 4

    forループで非同期しても実行時間が改善されないのはなぜですか?

  5. 5

    この非同期関数が同期して実行されているのはなぜですか?

  6. 6

    この非同期コードが停止しないのはなぜですか?

  7. 7

    コールバック付きの関数が非同期関数内で実行されないのはなぜですか?

  8. 8

    非同期タスクが正しく実行されないのはなぜですか?

  9. 9

    このコードは非同期で実行されていますか?

  10. 10

    非同期関数だけが非同期コードで生成できるのはなぜですか?

  11. 11

    非同期関数で前の.thenの後に実行されないのはなぜですか?

  12. 12

    実装するインターフェースが非同期の場合、「この非同期メソッドには「await」演算子がなく、同期的に実行されます」という警告を抑制するにはどうすればよいですか?

  13. 13

    非同期コードが同期よりもはるかに高速であると見なされるのはなぜですか?

  14. 14

    この非同期コードが失敗することがあり、観察されない場合にのみ失敗するのはなぜですか?

  15. 15

    コードは機能しますが、非同期ではなく同期的に実行されているようです

  16. 16

    ドキュメントの作成と更新時にマングースが非同期で実行されるのはなぜですか?

  17. 17

    SmtpClient.SendAsyncが非同期でないのはなぜですか?

  18. 18

    関数内で変数を変更した後、変数が変更されないのはなぜですか?-非同期コードリファレンス

  19. 19

    非同期のキャッチがコードの起動を待たないのはなぜですか?

  20. 20

    setTimeoutを使用する同期コードがJavaScriptで非同期に動作するのはなぜですか?

  21. 21

    この単純な非同期--promise--reduceコードが機能しているのはなぜですか?

  22. 22

    この非同期メソッドにコンパイルエラーがないのはなぜですか?

  23. 23

    この非同期コードで同じ結果が繰り返し得られるのはなぜですか?

  24. 24

    呼び出し元メソッドの次の行が実行される前に非同期メソッドが終了するのはなぜですか?

  25. 25

    非同期モジュールを使用しているにもかかわらず、これらの関数が非同期で実行されるのはなぜですか

  26. 26

    setStateは非同期なので、コールバックキューを介して実行されますか?

  27. 27

    なぜC ++非同期は未来なしで順次実行されるのですか?

  28. 28

    Promise.allが2つの関数を非同期で実行しないのはなぜですか?

  29. 29

    IAsyncEnumerableを返す非同期メソッドが構造体ではなくクラスとして実装されているのはなぜですか?

ホットタグ

アーカイブ