我仍然在努力完全理解异步/等待的方法。任何人都可以告诉我,因为在主题确实等待Task.Run后面呢?有时候人们在做异步方法,包括等待,但是有时候人们会做不使用异步方法的Task.Run。什么是正确的方法?确实等待Task.Run()
回答
不,async await只是让代码在别的东西被阻塞的时候运行,并且它不会执行Task.Run或者启动一个新的线程。
https://blog.stephencleary.com/2013/11/there-is-no-thread.html是一个体面的解释。
async
运营商只是在一种方法中打开使用运营商await
。 await
运营商将处理任何等待。在.NET中,Task
和Task<T>
是等待 s的一些示例。
Task.Run
回报Task
和Task.Run<T>
回报Task<T>
和我说,他们都awaitable所以你可以await
他们。
,如果你愿意,你甚至可以编写自己的awaitable类型:你只需要确保满足什么被认为是一个awaitable的要求。 等待需要提供GetAwaiter
的实现,就是这样。下面是一个awaitableexample:
public struct SimpleInt32Awaitable
{
public SimpleInt32Awaiter GetAwaiter()
{
return new SimpleInt32Awaiter();
}
}
public struct SimpleInt32Awaiter
{
public bool IsCompleted { get { return true; } }
public void OnCompleted(Action continuation)
{
}
public int GetResult()
{
return 5;
}
}
现在你可以这样做:
// Within some other class
static async void SimpleWaitAsync()
{
SimpleInt32Awaitable awaitable = new SimpleInt32Awaitable();
int result = await awaitable;
}
有你在哪里使用异步限制和等待的情况下 - 这是,一般情况下,为什么你会有时会看到使用Task.Run - 这允许您在同步方法中使用异步代码。
有必要的一个示例是,在MVC中使用Child Actions时 - 框架不支持异步子操作,因此必须使用Task.Run调用异步代码。
确实在等待Task.Run的背后?
其他人已经链接到C#并发,There Is No Thread克利里的很多优秀的博客文章之一。
不,它不会在幕后使用Task.Run
。
await
对于不止Task.Run
是有用的。它用于在之后运行代码已完成。这可能是由Task.Run
创建的计算任务,但它也可以是数据检索,例如ReadLineAsync
。 Task
是用来模拟所有这些东西的类。
Task.Run
是used排队工作线程池上运行。在编写CPU绑定代码时这是适当的,但是you shouldn't use Task.Run when dealing with IO-bound operations。在这种情况下,您的异步代码(可能使用async/await)应该使用异步IO方法,如WriteLineAsync
和前述的ReadLineAsync
。
这是使用Task.Run
在工作线程上运行阻止代码的反模式。你永远不想这样做,即使它确实要解锁你的GUI线程。
有时人们在做异步metod包括await,但有时人们会做不使用异步方法的Task.Run。什么是正确的方法?
可以使用Task.Run
确实创造一个Task
就让它运行,而无需使用await
或ContinueWith
。这些被称为“火灾和遗忘”任务。他们很少是一个好主意。与使用await
时不同,该任务引发的任何异常都将丢失。
这是通过解释 - 你猜对了 - 斯蒂芬·克利里,在this StackOverflow answer.
- 1. 异步/等待task.run与task.run并在.NET 4.0中继续
- 2. 等待与Task.Run(NonAsyncMethod())更好吗?
- 3. 正确的使用方法Task.Run和等待
- 4. BlackBerry推送实现与等待确认
- 5. 如何正确实现异步/等待
- 6. 实现互斥确保有界等待
- 7. simplemodal确认实例等待返回值
- 8. 正确等待等待元素消失?
- 9. Response.Cookies.Add等待确认?
- 10. 等待准确didUpdateToLocation
- 11. 的SynchronizationContext上Task.Run流而不是在等待
- 12. 访问UI控件在Task.Run与异步/等待上的WinForms
- 13. 什么时候应该使用Task.Run()而不是等待?
- 14. 异步/等待和Task.Run - 如何知道什么时候完成
- 15. 我应该在Task.Run中使用异步/等待
- 16. 等待组实施
- 17. 什么等待()其实是指Java?我会等待还是等待?
- 18. 最佳实践/等待
- 19. 实现像等待光标
- 20. 等待方法未正确等待元素可见
- 21. 如何等待I/O或等待锁释放实施?
- 22. 为什么Task.Run(()=> something)调用了一个等待死锁的同步方法?
- 23. 等待Task.Run(...)表现为不同的控制台和Windows应用程序
- 24. 我在Task.Run(()=> MyTask).Result之间输了什么,等待MyTask和MyTask.Result?
- 25. 如何使用Task.Run如果使用库不支持异步等待
- 26. 我无法等待等待?
- 27. 异步等待不等待
- 28. 等待Task.WhenAll()与Task.WhenAll()等待()
- 29. 等待工作不等待
- 30. '等待$ COPROC_PID' 不等待
不,不。你可能会发现斯蒂芬克利里的[没有线程](https://blog.stephencleary.com/2013/11/there-is-no-thread.html)很有帮助。 –