我试图理解 async/await 的精确行为,但在理解它时遇到了一些麻烦。
考虑这个例子:
public async void StartThread()
{
while(true){
SomeOtherClass.SomeSynchronousStuff();
var something = await SomeOtherClass.SomeOtherAsyncMethod();
}
}
public void ConstructorForThisClass()
{
Thread thread = new Thread(StartThread);
thread.Start();
}
我对 async/await 的理解是,编译器本质上是将代码转换为一堆回调并为每个回调存储状态对象。
所以根据这个,我的问题是:
- 新创建的线程会异步运行吗?意思是,当线程正在等待
SomeOtherAsyncMethod
,会被腾出来从事其他工作吗?
- 如果上述情况为真,则线程是否会直接结束,并在以下情况下由线程池线程取代它:
SomeOtherAsyncMethod
回报?
- 我将如何发行
StartThread
在线程池线程而不是托管线程上运行?
- 当可等待方法返回到其调用者时,它是否会强制在调用它的线程上恢复,或者是否可以由任何空闲线程代替它?
裸线程不能很好地工作async
/await
.
新创建的线程会异步运行吗?这意味着,当线程等待 SomeOtherAsyncMethod 时,它是否会被释放以从事其他工作?
实际上,线程将会退出。什么时候StartThread
后恢复await
,它将在线程池线程上执行。
我将如何在线程池线程而不是托管线程上发出 StartThread 函数?
首先,您想要更改的返回类型StartThread
from void
to Task
. async void
方法用于事件处理程序;在其他地方使用它们可能会导致各种问题。
然后你可以通过调用它Task.Run
:
var backgroundTask = Task.Run(() => StartThread());
当可等待方法返回到其调用者时,它是否会强制在调用它的线程上恢复,或者是否可以由任何空闲线程代替它?
默认情况下,await
操作员将捕获“当前上下文”并恢复在此背景下。这个“当前上下文”是SynchronizationContext.Current
,除非是null
,在这种情况下是TaskScheduler.Current
。通常,这是 UI/ASP.NETSynchronizationContext
,否则它是线程池上下文(TaskScheduler.Default
).
你可能会发现我的async intro有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)