C# 默认情况下,异步/等待代码是否使用现有线程在等待后执行代码?
在TPL中,C# 默认情况下,异步/等待代码是否使用现有线程在等待后执行代码?,c#,.net,C#,.net,在TPL中,TaskContinuationOptionsenum有一个值ExecuteSynchronously,表示希望执行第一个任务的线程也执行continuateWith任务 Task t = Task.Run(() => func1()); t.ContinueWith(t => func2(), TaskContinuationOptions.ExecuteSynchronously); 因此,一个工作线程将执行func1,然后该任务被视为已完成,然后该工作线程将继续执
TaskContinuationOptions
enum有一个值ExecuteSynchronously
,表示希望执行第一个任务的线程也执行continuateWith任务
Task t = Task.Run(() => func1());
t.ContinueWith(t => func2(), TaskContinuationOptions.ExecuteSynchronously);
因此,一个工作线程将执行func1
,然后该任务被视为已完成,然后该工作线程将继续执行func2
,因为同步执行
,如果我们不使用该枚举值,另一个工作线程可以执行func2
但是如果您使用async/await来编写代码(计算绑定),例如
静态异步任务MyMethodAsync(){
等待任务。运行(()=>{
func1();
});
func2();
}
工作线程将执行
func1
,理论上,不同的工作线程可能会执行func2()
,因为没有类似TaskContinuationOptions的配置。我们可以使用同步执行。但是我试过几次,工作线程执行func1
,也执行func2
,所以我的问题是,异步/等待代码是否默认使用现有线程在等待后执行代码?如果答案是肯定的,那么如何使它以不同的方式工作,允许不同的工作线程执行func2
?它可以使用不同的线程,也可以使用相同的线程。我认为使用WPF和默认的SynchronizationContext,函数将被发布到WPF调度程序,这基本上意味着所有内容都将始终在主ui线程上运行。不同的SynchronizationContext“将具有不同的行为。希望其他用户确认或否认-我不是100%确定。这是否回答了你的问题?这能回答你的问题吗?还有“我怎样才能让它以不同的方式工作,允许不同的工作线程执行func2?”——一篇文章中的问题太多了。第一种想法已经得到了回答。见第一份副本。第二个问题也已经得到了回答;请参阅第二个和第三个副本…如果延续需要特定线程,即使用同步上下文,则可以使用ConfigureAwait(false)防止该情况发生代码>。但在您的示例中,已经没有使用特定线程的要求,所以可能。。。。。。您不使用当前线程的原因是什么?如果希望某个特定线程处理continuations,则需要通过传递一个知道所需线程的调度程序来告诉ContinueWith()
。见第四份副本
static async Task<String> MyMethodAsync() {
await Task.Run(() => {
func1();
});
func2();
}