难以理解异步和等待的必要性

28 浏览
0 Comments

难以理解异步和等待的必要性

这个问题已经有了答案:

如何使用\'async\'和\'await\'

昨天,我学习了C#多任务的基础知识。虽然我在技术上似乎理解了它的工作原理,但我不明白为什么要这样做。请记住我是新手,这可能意味着我理解了一些错误的东西。例如,您可以编写:

public async Task SomeEventHandler()
{   if(foo) return await SomeMethod("a");
    else return await SomeMethod("b");
}
async Task SomeMethod(string whatever)
{   string bar = await SomeInput();
    return bar + " " + whatever;
}

我不明白的是,为什么需要async和await关键字?为什么不能只写:

public void SomeEventHandler()
{   if(foo) return SomeMethod("a");
    else return SomeMethod("b");
}
int SomeMethod(string whatever)
{   string bar = SomeInput();
    return bar + " " + whatever;
}

输入方法实现类似于:

public string SomeInput()
{   while(!InputObject.stuffIncoming)
    {    CurrentTheard.DoSomethingElse();
    }
    return InputObject.Next();
}

有人能解释为什么这样不起作用,或者以不良的方式起作用吗?编辑:根据答案,似乎因为某种原因,进行等待的方法不能像普通方法一样调用,反之亦然。但是是什么导致了这种情况?至少在D语言中,您可以同时调用或生成相同函数的线程。

admin 更改状态以发布 2023年5月24日
0
0 Comments

异步和等待的思想是提供一种简单的方式来实现“并行执行回调”的方法。每当使用关键字await时,下一行代码的执行被延迟直到当前行完成(就像正常执行一样)但是当前的Thread不会被阻塞。这意味着在后台发生以下情况:\n

    \n

  1. 使用await调用长时间运行的操作
  2. \n

  3. 长时间执行的操作在另一个Thread中执行
  4. \n

  5. 剩余方法代码将注册为回调方法
  6. \n

  7. 调用的Thread在启动长时间运行操作的方法后继续执行
  8. \n

  9. 长时间运行的操作最终完成
  10. \n

  11. 执行回调方法(来自第3点)
  12. \n

\n好处是你的代码会保持易于阅读。你不必费心去处理Threads和回调。

0