c# - 为什么不使用同步方法而不是等待异步任务?

标签 c# asynchronous

异步方法:

public void Main(){
    await Asynctask1;
    DoSomething();
}

public async Task AsyncTask1(){
    //Async logic here
}

同步方式:

public void Main(){
    SyncMethod1();
    DoSomething();
}

我想我在这里遗漏了一些东西。假设 SyncMethod1()Asynctask1() 都做同样的事情,那么这两个构造最终不是相同的结果,即 DoSomething() 直到前面的方法完成后才开始?

最佳答案

namely that DoSomething() doesn't start until the method before finishes?

异步顺序 是有区别的。当您总是立即 await 异步方法时,您最终会得到异步顺序代码,乍一看,它的行为确实与同步顺序代码类似。 (附带说明一下,这种相似性是 async/await 关键字的全部要点)。但是,有一个重要的区别。

假设操作是一些 I/O 事情,比如获取 HTTP 资源。 SyncMethod1 将同步执行 HTTP 获取;也就是说,它发出 HTTP 请求,然后阻塞线程,直到它获得 HTTP 响应。 AsyncTask1 将异步执行 HTTP 获取;也就是说,它发出 HTTP 请求,然后返回一个不完整的 Task。之后当HTTP请求进来时,AsyncTask1方法会恢复并完成返回的Taskawait之后的代码会运行(即,DoSomething)。

异步方式更复杂,但有一个关键优势:它不会阻塞线程。因此,UI 线程被释放以启用响应式 UI,ASP.NET 线程被释放以处理其他请求。

我有一个 async intro在我的博客上,可能对您的学习有所帮助。

关于c# - 为什么不使用同步方法而不是等待异步任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23559215/

相关文章:

c# - GAE 数据存储 - 如何创建非索引实体属性

c# - XmlSerializer 添加属性

c# - 白色背景的组合框 DropDownList 样式

silverlight - 使用 F# 和异步工作流在 Silverlight 中拖放

java - 等待函数完成,直到回调到来

angular - 在 MatPaginator 不工作的情况下,在 Mat Table 中异步排序 Mat Sort,在模板中异步分配数据源

c# - 目标数组不够长

c# - ASP.NET Core 属性路由

c# - IAsyncEnumerable 或 IAsyncEnumerator 的工厂

c# - 无法在 Debug模式下访问匿名类型的属性(VS2013)