无尽的异步和等待?

时间:2014-07-02 11:36:31

标签: c# .net asynchronous async-await

我不了解async / await:

异步方法必须在内部进行await调用...但是如果有等待它是因为它正在调用另一个异步方法,对吧?所以它似乎是一个无休止的异步方法链,等待内部调用另一个异步方法。

因此可以创建一个“第一”异步方法,而不是调用其他任何异步方法。只需创建一个异步方法,因为该方法可以完成许多可能会降低系统速度的工作。

4 个答案:

答案 0 :(得分:4)

首先,一些澄清

一种方法不需要等待async,反之亦然。您只能在await方法中使用async。您可能的方法会返回Task,而不会将其标记为async。更多here

您的实际问题

IIUC,关于&#34;所有异步的根源&#34; 。 所以,是的, 可以创建一个&#34;第一个&#34; async方法。它只是一种返回Task(或Task<T>)的方法。

这些任务有两种类型:A Delegate Task and a Promise Task

  1. 代理任务由Task.Run触发(大多数时候。Task.StartNewnew Task(() => {});是其他选项)并且它有代码可以运行。这主要用于卸载工作。
  2. 承诺任务是Task,它实际上并不执行任何代码,它只是 a 的机制。等待完成后通知 Task b。使用 Task完成信号。这是使用TaskCompletionSource完成的,主要用于固有异步操作(但也适用于async synchronization objects),例如:
  3. private static Task DoAsync()
    {
        var tcs = new TaskCompletionSource<int>();
        new Thread(() =>
        {
            Thread.Sleep(1000);
            tcs.SetResult(5);
        }).Start();
    
        return tcs.Task;
    }
    

    这些工具允许您创建这些&#34;根&#34;,除非您实施I/O库(如.Net&#39} DNS类)或一个同步对象(如SemaphoreSlim)你自己很少使用它们。

答案 1 :(得分:2)

async关键字的目的是简单地允许在方法中使用await,而不是 来调用另一个async方法内部例如

public async void WaitForSomething()
{
    await Task.Delay(1000);
}

答案 2 :(得分:1)

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

  • 您可以使用任务构造函数(尽管除非您有特别令人信服的理由创建一个代表您在委托实际开始执行之前使用的委托的执行的任务,否则您应该避免这样做。使用下一个选项。

  • 您可以使用Task的现有方法创建任务,例如Task.Run来表示另一个线程中委托的执行,Task.WhenAll表示完成一系列其他任务,Task.FromAsync基于异步编程的不同模式创建任务等。

  • 您可以使用TaskCompletionSource创建随时可以完成的任务,从而允许您将任何固有的异步行为转换为Task。本质上异步操作可以是事件触发,调用回调方法等,

答案 3 :(得分:0)

如果你有一个非常密集的方法,可以做很多工作,可能会减慢系统速度,你可以像这样调用它。

public async void CallerAsyncMethod()
{
    var taskResult = Task.Factory.StartNew(() => IntensiveMethod());
    await taskResult;
}

此处IntensiveMethod不是异步方法。

希望它有所帮助。