我有一个创建任务和延续任务的 WebService。
在第一个任务中我们设置了Thread.CurrentPrincipal
因此,当 ContinuationTask 启动时,它不再具有 Thread.CurrentPrincipal。
我想在 ContinuationTask 中指定它应该在与其前身相同的线程中运行。
我在网上搜索过,但我只发现线程需要在 SynchronizationContext 中运行,因此我开始认为我缺少一些基本规则,特别是关于 Thread.Principal 应该如何工作的规则。
最佳答案
首先,不要为此目的使用 TaskContinuationOptions.ExecuteSynchronously
!您不能在同一线程上强制继续。它只在非常高的概率下起作用。总是有不起作用的情况:太多的递归会导致TPL不能同步执行。自定义 TaskScheduler
也没有义务支持这一点。
这是一种常见的误解,尤其是因为它在网络上被错误地传播。以下是关于该主题的一些读物: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# - 与上一个线程在同一线程中的继续任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14057721/