首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >永无止境的异步等待?

永无止境的异步等待?
EN

Stack Overflow用户
提问于 2014-07-02 11:36:30
回答 4查看 1.8K关注 0票数 8

我不理解异步/等待:

异步方法必须在.但是如果有等待,那是因为它正在调用另一个异步方法,对吗?因此,它似乎是一个无休止的异步方法链,在其中等待调用另一个异步方法。

因此,是否可以创建“第一个”异步方法,而不调用内部的任何其他异步方法。只需创建一个异步方法,因为该方法做了大量的工作,可能会减慢系统的运行速度。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-07-02 19:30:31

首先是一些澄清。

方法不需要等待成为async,而是相反。只能在await方法中使用async。您可能有一个方法返回一个Task,而不将它标记为async。更多的这里

你的实际问题

IIUC是关于“所有异步的根”的。因此,是的,创建“第一个”async方法是可能的。它只是一个返回Task (或Task<T>)的方法。

这些任务有两种类型:代表任务和承诺任务

  1. 委托任务由Task.Run触发(大多数情况下)。Task.StartNewnew Task(() => {});是其他选项),它有代码要运行。这主要用于卸载工作。
  2. 承诺任务是一个不实际执行任何代码的Task,它只是a.的一种机制,等待Task完成通知。b.使用Task完成信令。这是用TaskCompletionSource完成的,主要用于本质上的异步操作(但也用于同步对象),例如:

代码语言:javascript
运行
复制
private static Task DoAsync()
{
    var tcs = new TaskCompletionSource<int>();
    new Thread(() =>
    {
        Thread.Sleep(1000);
        tcs.SetResult(5);
    }).Start();

    return tcs.Task;
}

这些工具允许您创建这些“根”,但是除非您实现了一个I/O库(比如.NetDNS类)或一个同步对象(比如SemaphoreSlim本身),否则很少使用它们。

票数 6
EN

Stack Overflow用户

发布于 2014-07-02 11:40:15

async关键字的目的是简单地允许在方法内使用await,您不必在内部调用另一个async方法。

代码语言:javascript
运行
复制
public async void WaitForSomething()
{
    await Task.Delay(1000);
}
票数 2
EN

Stack Overflow用户

发布于 2014-07-02 19:41:55

当然,除了使用Task方法之外,确实还有创建async的方法。

  • 您可以使用任务构造函数(尽管除非您有一个特别有说服力的理由来创建一个表示在委托实际开始执行之前使用的委托的执行情况的任务,否则您应该避免这样做。就用下一个选择吧。
  • 您可以使用现有的Task方法创建任务,例如Task.Run表示在另一个线程中执行委托,Task.WhenAll表示一系列其他任务的完成,Task.FromAsync用于创建基于异步编程的不同模式的任务,等等。
  • 您可以使用TaskCompletionSource来创建任何您想要完成的任务,允许您将任何固有的异步行为转换为Task。这种固有的异步操作可能是事件触发,调用回调方法等等。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24530108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档