Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程从异步点返回后做什么?_C# - Fatal编程技术网

C# 线程从异步点返回后做什么?

C# 线程从异步点返回后做什么?,c#,C#,我不熟悉.NET framework中提供的异步功能 因此,据我所知,async关键字提供的好处是,当线程调用异步方法时,它可以在等待点返回并正确地恢复运行 我的问题是,当它从那个点返回后,线程在做什么?它是否可以用于运行线程池中的其他任务项,如果可以,则必须仍然存在上下文切换?如果没有,为什么不在那里旋转呢 ===== 因此,将有其他线程接管异步函数的未完成部分,这个上下文切换是如何发生的,比如这些状态存储在哪里?另一个线程如何处理这些状态当你的代码点击一个await表达式时(假设awaita

我不熟悉.NET framework中提供的异步功能

因此,据我所知,async关键字提供的好处是,当线程调用异步方法时,它可以在等待点返回并正确地恢复运行

我的问题是,当它从那个点返回后,线程在做什么?它是否可以用于运行线程池中的其他任务项,如果可以,则必须仍然存在上下文切换?如果没有,为什么不在那里旋转呢

=====
因此,将有其他线程接管异步函数的未完成部分,这个上下文切换是如何发生的,比如这些状态存储在哪里?另一个线程如何处理这些状态

当你的代码点击一个
await
表达式时(假设awaitable没有同步完成),控件返回到调用方法,就像你写了
return一样
(它返回一个
任务
,调用者可以使用该任务等待异步部分的完成)

然后,调用方法将继续执行,直到返回(通常也会立即返回,因为它等待返回的任务),依此类推,直到到达调用堆栈的顶部(面向用户的部分)

一旦它到达调用堆栈的顶部,该线程将执行它自然执行的任何操作

如果是UI线程,它将返回到消息循环,保持UI响应

如果是线程池线程(或ASP.Net工作线程),它将返回到线程池并(同步)等待更多工作


如果它是一个“原始”线程(控制台应用程序中的主线程,或
新线程()
),它将终止。

是,该线程返回并可以执行其他工作

至于
为什么不在那里旋转呢
,因为它可以做其他工作。当线程有机会做工作时,强迫它保持空闲是没有意义的

如果您不关心哪个线程将实际继续执行工作,则可以使用Task.ConfigureAwait,如下所示:

await foo.DoSomethingAsync().ConfigureAwait(continueOnCapturedContext: false);

ConfigureAwait()
与线程下一步做什么无关。@SLaks-我是从整个过程的角度来看这一点的,而不仅仅是从一个特定的线程。我意识到这是OP最初的问题,但思维的自然发展通常会导致需要完成的其他工作发生什么。那么呢剩下的等待完成的工作?其他线程将开始。此切换过程是如何发生的?@zinking:使用
Task.ContinueWith()
,它接受一个回调,以类似闭包的方式捕获当前状态。请参阅类似主题: