麻烦理解需要异步和等待

时间:2017-07-11 08:10:12

标签: 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。

1 个答案:

答案 0 :(得分:0)

async和await背后的理念是提供一种简单的方法来实现&#34;并行执行回调&#34;做法。每当使用关键字await时,下一行代码的执行将被延迟,直到当前行完成(就像在正常执行中一样)但当前Thread是没有阻止。这意味着在幕后发生了以下情况:

  1. 使用await
  2. 调用长时间运行的操作
  3. 长时间运行的操作在另一个Thread
  4. 中执行
  5. 其余的方法代码已注册为回调方法
  6. 在启动长时间运行操作的方法
  7. 之后,调用Thread继续执行
  8. 长时间运行的操作最终完成
  9. 执行回调方法(从第3点开始)
  10. 好处是,您的代码仍然易于阅读。您不必为Threads和回调

    而烦恼