c# – 连续任务与以前的线程相同

我有一个WebService创建一个任务和一个继续任务.

在第一个任务中我们设置Thread.CurrentPrincipal

因此,当ContinuationTask启动时,它不再具有Thread.CurrentPrincipal.

我想在ContinuationTask中指定它应该在其前提下运行在同一个线程中.

我已经搜索过网络,但我只发现线程要在SynchronizationContext中运行,所以我开始认为我缺少一些基本的规则,特别是关于Thread.Principal应该如何工作.

最佳答案
首先,不要为此目的使用TaskContinuationOptions.ExecuteSynchronously!你不能强制继续在同一个线程上.它只能以非常高的概率工作.总是有些情况不起作用:太多的递归将导致TPL不能同步执行.自定义TaskSchedulers也没有义务支持这一点.

这是一个常见的误解,特别是因为它在网络上被错误地传播.这是关于这个话题的一些阅读:http://blogs.msdn.com/b/pfxteam/archive/2012/02/07/10265067.aspx

如果您需要在同一个线程上运行,请执行以下操作:

Task.Factory.StartNew(() => { First(); Second(); });

太简单.

让我说明为什么通过显示一个替代解决方案:

void MyCompositeTask()
{
  var result = First();
  Second(result);
}
Task.Factory.StartNew(() => MyCompositeTask());

这看起来更直观:我们将MyCompositeTask传递给TPL以运行. TPL不关心我们在回调中所做的工作.我们可以做任何我们想要的,包括调用多种方法并传递结果.

转载注明原文:c# – 连续任务与以前的线程相同 - 代码日志