我不理解异步/等待:
异步方法必须在.但是如果有等待,那是因为它正在调用另一个异步方法,对吗?因此,它似乎是一个无休止的异步方法链,在其中等待调用另一个异步方法。
因此,是否可以创建“第一个”异步方法,而不调用内部的任何其他异步方法。只需创建一个异步方法,因为该方法做了大量的工作,可能会减慢系统的运行速度。
发布于 2014-07-02 19:30:31
首先是一些澄清。
方法不需要等待成为async,而是相反。只能在await方法中使用async。您可能有一个方法返回一个Task,而不将它标记为async。更多的这里。
你的实际问题
IIUC是关于“所有异步的根”的。因此,是的,创建“第一个”async方法是可能的。它只是一个返回Task (或Task<T>)的方法。
这些任务有两种类型:代表任务和承诺任务。
Task.Run触发(大多数情况下)。Task.StartNew和new Task(() => {});是其他选项),它有代码要运行。这主要用于卸载工作。Task,它只是a.的一种机制,等待Task完成通知。b.使用Task完成信令。这是用TaskCompletionSource完成的,主要用于本质上的异步操作(但也用于同步对象),例如:。
private static Task DoAsync()
{
var tcs = new TaskCompletionSource<int>();
new Thread(() =>
{
Thread.Sleep(1000);
tcs.SetResult(5);
}).Start();
return tcs.Task;
}这些工具允许您创建这些“根”,但是除非您实现了一个I/O库(比如.Net的DNS类)或一个同步对象(比如SemaphoreSlim本身),否则很少使用它们。
发布于 2014-07-02 11:40:15
async关键字的目的是简单地允许在方法内使用await,您不必在内部调用另一个async方法。
public async void WaitForSomething()
{
await Task.Delay(1000);
}发布于 2014-07-02 19:41:55
当然,除了使用Task方法之外,确实还有创建async的方法。
Task方法创建任务,例如Task.Run表示在另一个线程中执行委托,Task.WhenAll表示一系列其他任务的完成,Task.FromAsync用于创建基于异步编程的不同模式的任务,等等。TaskCompletionSource来创建任何您想要完成的任务,允许您将任何固有的异步行为转换为Task。这种固有的异步操作可能是事件触发,调用回调方法等等。https://stackoverflow.com/questions/24530108
复制相似问题