Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.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#_.net - Fatal编程技术网

C# 默认情况下,异步/等待代码是否使用现有线程在等待后执行代码?

C# 默认情况下,异步/等待代码是否使用现有线程在等待后执行代码?,c#,.net,C#,.net,在TPL中,TaskContinuationOptionsenum有一个值ExecuteSynchronously,表示希望执行第一个任务的线程也执行continuateWith任务 Task t = Task.Run(() => func1()); t.ContinueWith(t => func2(), TaskContinuationOptions.ExecuteSynchronously); 因此,一个工作线程将执行func1,然后该任务被视为已完成,然后该工作线程将继续执

在TPL中,
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();
}