c# - 与上一个线程在同一线程中的继续任务

标签 c# task-parallel-library impersonation

我有一个创建任务和延续任务的 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/

相关文章:

c# - Java中任务并行库的等价物

c# - IBackgroundTask 类中的任务类型

c# - 如何从 C# 运行 PowerShell 脚本

.net - C# 通过模拟访问 DirectoryEntry 只会在第一次抛出灾难性异常

C#高精度计算

c# - 在 .NET/C# 中渲染 Handlebar 模板服务器端

c# - 使用 .NET 任务并行库捕获错误

windows-8 - 为 webview 控件提供域/用户凭据

c# - 如何使 FakeItEasy 伪造对象的方法在第一次调用时抛出并在第二次调用时返回?

c# - 跨域不适用于 signalr 2.0