gpt4 book ai didi

c# - 将 ThreadStatic 字段与任务一起使用

转载 作者:行者123 更新时间:2023-11-30 12:48:33 26 4
gpt4 key购买 nike

开始编辑

执行此操作的“正确”方法(4.5 之前)是使用此处概述的 SynchronizationContext:http://msdn.microsoft.com/en-us/magazine/gg598924.aspx

我相信在 4.5 中,SynchronizationContext 会使用 async/await 关键字自动为您处理,但还没有做足够的工作来确认。

在 4.0 中,您可能希望利用“TaskScheduler.FromCurrentSynchronizationContext”来捕获当前线程的上下文(在我的例子中,这将包括 HttpContext,但 BCL 的各个部分提供了类似的构造)。

结束编辑

主要问题是:

以下是与任务共享“上下文”的“安全”机制吗?

不深入太多细节,在我的用例中,不可能将上下文直接下推到操作中。

public static class ContextCaller{
[ThreadStatic]
public static object SharedState;

public static Task InvokeWithContext(this Action theAction){
//We're still running in the "outer" context,
//so we can collect a variable and store it in the thread-static
//field by closing it into the task.
var context = new object();

var t = new Task(()=>{
try{
//close in the context
SharedState = context;
theAction();
}
finally{
//teardown the shared state.
SharedState = null;
}
});
t.Start();
return t;
}
}

现在是客户端代码:

//client code:
Action doWork = ()=>{
var state = ContextCaller.SharedState;
//do work on state, potentially throwing an exception in the process.
};

//cause the task to be invoked with some data available only on this thread.
doWork.InvokeWithContext();

根据我对任务和线程之间关系的理解,以上应该是安全的,因为:

  1. 一个任务将只在一个线程上运行(假设该操作不会产生额外的任务/线程)。
  2. 设置了 ThreadStatic 字段在执行“theAction()”之前,“finally”保证这个字段是在调用“theAction()”后重置,无论结果如何。

除了显式关闭“theAction”的参数外,还有其他更好的模式来定义任务的上下文吗?

最佳答案

我看不出您的代码不能正常工作的任何技术原因。

但我也认为这样做是一种不好的做法,只有在确实没有其他方法的情况下,我才会使用这样的方法。而且我认为添加另一个需要 Action<object> 的方法重载(或者更好的是,使用强类型参数)不应该是一个重大变化。

关于c# - 将 ThreadStatic 字段与任务一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13883769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com