为什么我的异步代码没有运行异步?

阿夫罗洪·伊斯洛尔(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 是窗口上的列表框。

当我单击按钮时,我看到这三个方法总是按照我调用它们的顺序执行,而与每个延迟的时间长短无关。

我显然误会了这些东西是如何工作的,但是在阅读了几个小时,并尝试了许多代码变体之后,我无法按我的预期工作。

请任何人在这里澄清我做错了什么吗?

克里斯

尝试这种方法,看来您正在启动一个异步方法,但立即在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

为什么C ++异步顺序运行而没有未来?

来自分类Dev

为什么异步/等待不异步运行?

来自分类Dev

为什么我的 python 代码没有完全运行

来自分类Dev

为什么我的Spring @Async bean方法没有被异步执行?

来自分类Dev

为什么我的Spring @Async bean方法没有被异步执行?

来自分类Dev

为什么我不能在异步方法中调试代码?

来自分类Dev

为什么我不能从异步代码中捕获异常?

来自分类Dev

异步I / O密集型代码的运行速度比非异步慢,为什么?

来自分类Dev

为什么使用mocha和pogo运行异步测试时this.timeout为什么没有效果?

来自分类Dev

为什么在使用异步操作时没有堆栈溢出?

来自分类Dev

为什么这个异步方法没有编译错误?

来自分类Dev

为什么只有异步函数才能产生异步代码?

来自分类Dev

尽管收到有效的操作负载(异步身份验证调用),为什么我的 Redux 状态没有更新

来自分类Dev

为什么我的代码没有递增?

来自分类Dev

异步编程,为什么不执行代码

来自分类Dev

为什么这个异步代码不停止?

来自分类Dev

为什么这个 Javascript 代码是异步的?

来自分类Dev

为什么异步并行队列最后运行

来自分类Dev

为什么要执行额外的异步操作,使我的代码比根本不执行代码时更快?

来自分类Dev

为什么我的代码在没有“ Option Explicit”的情况下运行却失败了?

来自分类Dev

为什么我的`try`块的`else`部分中的代码没有运行?

来自分类Dev

应用内购买成功,但是没有运行我的代码。为什么?

来自分类Dev

为什么我的代码运行相同的列表,即使它甚至没有被使用?

来自分类Dev

为什么异步代码在C#中的工作线程上运行

来自分类Dev

为什么这种异步代码有时会失败,而且只有在没有观察到的时候才失败?

来自分类Dev

为什么这种异步代码有时会失败,并且只有在没有观察到的情况下才会失败?

来自分类Dev

为什么我不能在 JavaScript 中编写这样的异步代码?

来自分类Dev

我知道回调函数异步运行,但是为什么呢?

来自分类Dev

为什么认为异步代码比同步代码快得多?

Related 相关文章

  1. 1

    为什么C ++异步顺序运行而没有未来?

  2. 2

    为什么异步/等待不异步运行?

  3. 3

    为什么我的 python 代码没有完全运行

  4. 4

    为什么我的Spring @Async bean方法没有被异步执行?

  5. 5

    为什么我的Spring @Async bean方法没有被异步执行?

  6. 6

    为什么我不能在异步方法中调试代码?

  7. 7

    为什么我不能从异步代码中捕获异常?

  8. 8

    异步I / O密集型代码的运行速度比非异步慢,为什么?

  9. 9

    为什么使用mocha和pogo运行异步测试时this.timeout为什么没有效果?

  10. 10

    为什么在使用异步操作时没有堆栈溢出?

  11. 11

    为什么这个异步方法没有编译错误?

  12. 12

    为什么只有异步函数才能产生异步代码?

  13. 13

    尽管收到有效的操作负载(异步身份验证调用),为什么我的 Redux 状态没有更新

  14. 14

    为什么我的代码没有递增?

  15. 15

    异步编程,为什么不执行代码

  16. 16

    为什么这个异步代码不停止?

  17. 17

    为什么这个 Javascript 代码是异步的?

  18. 18

    为什么异步并行队列最后运行

  19. 19

    为什么要执行额外的异步操作,使我的代码比根本不执行代码时更快?

  20. 20

    为什么我的代码在没有“ Option Explicit”的情况下运行却失败了?

  21. 21

    为什么我的`try`块的`else`部分中的代码没有运行?

  22. 22

    应用内购买成功,但是没有运行我的代码。为什么?

  23. 23

    为什么我的代码运行相同的列表,即使它甚至没有被使用?

  24. 24

    为什么异步代码在C#中的工作线程上运行

  25. 25

    为什么这种异步代码有时会失败,而且只有在没有观察到的时候才失败?

  26. 26

    为什么这种异步代码有时会失败,并且只有在没有观察到的情况下才会失败?

  27. 27

    为什么我不能在 JavaScript 中编写这样的异步代码?

  28. 28

    我知道回调函数异步运行,但是为什么呢?

  29. 29

    为什么认为异步代码比同步代码快得多?

热门标签

归档