开始编辑
执行此操作(4.5之前)的“正确”方法是使用此处概述的SynchronizationContext:http://msdn.microsoft.com/en-us/magazine/gg598924.aspx
我相信在4.5中使用async / await关键字自动处理SynchronizationContext,但是没有做足够的工作来确认.
在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();
根据我对一个任务和一个线程之间关系的理解,上面应该是安全的,因为:
>一个任务将在一个线程上运行(假设该操作不会产生额外的任务/线程).
> ThreadStatic字段已设置
在执行“theAction()”之前,“finally”保证此字段为
无论结果如何,在调用“theAction()”之后重置.
除了明确地将参数关闭到“theAction”之外,还有其他更好的模式来定义任务上下文吗?
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。