如何在ExecutionContext中包含自己的数据

13

我知道当你通过调用BeginInvoke()或ThreadPool.QueueUserWorkItem(...)等方法以并行方式运行某些方法时,.NET框架会捕获ExecutionContext对象,其中包含代码访问安全性信息和其他一些内容。

我想要的是,在执行并行任务的同时向ExecutionContext中添加一些数据,但这些数据也必须在任务入队时被捕获。

问题在于,我并不总是控制创建此并行任务的代码,因此必须找到一种在调用此外部代码之前存储此数据的方法。这就是我考虑使用ExecutionContext类的原因。

在我无法总是控制将工作分配给线程的代码时,是否有一种方法可以传递一些状态给并行任务呢?


很遗憾你无法控制排队代码 - 捕获变量或类字段是理想的。 - Marc Gravell
3个回答

15

找到了:

CallContext.LogicalSetData(...)

(文档)

CallContext.LogicalGetData(...)

(文档)


1
您可以使用 AsyncLocal<T> 存储值,这些值将随着执行上下文传播。

例如:

var myLocal = new AsyncLocal<string> { Value = "My value" };

ThreadPool.QueueUserWorkItem(_ => { Console.WriteLine("Value: " + myLocal.Value); });

ExecutionContext.SuppressFlow();
ThreadPool.QueueUserWorkItem(_ => { Console.WriteLine("Value without flowing execution context: " + myLocal.Value); });
ExecutionContext.RestoreFlow();

// Output:
// Value: My value
// Value without flowing execution context:

请参见文档获取更多信息。


0
我不知道它与 ExecutionContext 有何关联,但早些时候,我们可以创建上下文绑定对象。请参阅 Context class。忽略这个特定类是用于基础设施的事实 - 这篇文章是学习上下文的起点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接