c# - 无法理解对异步和等待的需求

标签 c# asynchronous

<分区>

昨天,我学习了 C# 多任务处理的基础知识。虽然我在技术上似乎理解它是如何工作的,但我只是不明白为什么它会像现在这样完成。请记住,我是这个话题的新手,这可能表明我理解错了。例如,您可以这样写:

public async Task SomeEventHandler()
{   if(foo) return await SomeMethod("a");
    else return await SomeMethod("b");
}

async Task<int> 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 中,您可以为同一功能调用或生成一个 theard。

最佳答案

async 和 await 背后的想法是提供一种简单的方法来实现“并行执行回调”方法。每当使用关键字 await 时,下一行代码的执行都会延迟到当前行完成(就像正常执行一样)但是当前的 线程 未被阻塞。这意味着在幕后发生了以下情况:

  1. 您使用 await 调用长时间运行的操作
  2. 长时间运行的操作在另一个线程中执行
  3. 您的其余方法代码已注册为回调方法
  4. 调用Thread 在方法开始长时间运行操作后继续执行
  5. 长时间运行的操作最终完成
  6. 执行回调方法(从第 3 点开始)

好处是,您的代码将保持易于阅读。您不必为 Threads 和回调

而烦恼

关于c# - 无法理解对异步和等待的需求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45028892/

相关文章:

c# - 如何使用 System.Speech

c# - IndexOf 和序号字符串比较

javascript - 带有 async 的 node.js 异步回调

ios - 尝试将数据从响应 Swift Alamonfire 保存到核心数据时崩溃

python - Python请求-线程/进程与IO

c# - 在 sql server 中存储字母数字(如 pan 卡、选民 ID)的首选数据类型是什么?

c# - 如何以编程方式将内容类型添加到索引?

c# - 将 Xml 反序列化为 List<T> - xmlns ='' 不是预期的

javascript - 异步 javascript promise 使用 settimeout 调用

javascript - console.log() 异步还是同步?