Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# Task.ContinueWith是否捕获调用线程上下文以继续?_C#_.net_Asynchronous_Task Parallel Library_Async Await - Fatal编程技术网

C# Task.ContinueWith是否捕获调用线程上下文以继续?

C# Task.ContinueWith是否捕获调用线程上下文以继续?,c#,.net,asynchronous,task-parallel-library,async-await,C#,.net,Asynchronous,Task Parallel Library,Async Await,下面的Test\u单击是在UI线程上运行的简化版本的代码(带有): 我是否应该明确指定TaskScheduler.FromCurrentSynchronizationContext(),以确保继续操作将在同一UI线程上执行?或者,ContinueWith是否自动捕获执行上下文(因此,在这种情况下,TaskScheduler参数是多余的) 我假设默认情况下它不会这样做(不像wait),但到目前为止,我找不到在线资源来确认这一点。默认情况下它不使用当前同步上下文,而是使用TaskScheduler.

下面的
Test\u单击
是在UI线程上运行的简化版本的代码(带有):

我是否应该明确指定
TaskScheduler.FromCurrentSynchronizationContext()
,以确保继续操作将在同一UI线程上执行?或者,
ContinueWith
是否自动捕获执行上下文(因此,在这种情况下,
TaskScheduler
参数是多余的)


我假设默认情况下它不会这样做(不像
wait
),但到目前为止,我找不到在线资源来确认这一点。

默认情况下它不使用当前同步上下文,而是使用
TaskScheduler.current
,如以下反编译代码所示:

public Task ContinueWith(Action<Task<TResult>> continuationAction)
{
  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
  return this.ContinueWith(continuationAction, TaskScheduler.Current, new CancellationToken(), TaskContinuationOptions.None, ref stackMark);
}
public Task ContinueWith(Action continuationAction)
{
stackcrawmark stackMark=stackcrawmark.LookForMyCaller;
返回此.ContinueWith(continuationAction,TaskScheduler.Current,new CancellationToken(),TaskContinuationOptions.None,ref stackMark);
}

TaskScheduler.Current
TaskScheduler.Default
或当前任务的TaskScheduler(如果任务是子任务)。如果不想遇到任务调度程序,请始终指定任务调度程序;如果可以,请使用
wait

谢谢,这很有意义。我还发现,相关的,非常有帮助的。现在更容易找到参考资料来源:也就是说,你能解释一下StackScrawlMark的功能吗?
public Task ContinueWith(Action<Task<TResult>> continuationAction)
{
  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
  return this.ContinueWith(continuationAction, TaskScheduler.Current, new CancellationToken(), TaskContinuationOptions.None, ref stackMark);
}