我们在深度抽象程序集中的某个地方存在从OperationContext.Current中读取数据的WCF行为,当此代码从Task中执行时,OperationContext.Current为空,是否可以在抽象程序集内部解决这个问题,还是需要向这个程序集的所有消费者添加一些代码?在任务并行库中保留OperationContext
回答
似乎是唯一的办法就是添加一些的CallContext中,就像目前的主要存储...
点在哪里您创建Task
instance,你应该使用一个封闭,像这样:
// The operation context.
OperationContext oc = OperationContext.Current;
Task t = Task.Factory.StartNew(() => {
// Do something with context here, it will be valid for
// the life of the operation.
};
您也可以拨打overload of StartNew
这需要一个state
参数并通过OperationContext
instance中,铸造和使用它需要在Task
的时候,像这样:
Task t = Task.Factory.StartNew(s => {
// s is an object, so need to cast here.
var oc = (OperationContext) c;
// Work with the OperationContext.
},
// Note, this is passed to the delegate through the 's' parameter.
OperationContext.Current);
注意,在这两种情况下,OperationContext
只会有利于操作的使用寿命。该操作的完成应取决于Task
的完成情况。
如果你推出一个Task
将运行在操作完成后,那么你应该从你的OperationContext
需要的值那些复制到另一个结构的方式传递到Task
进行处理。
是的,我知道,但问题是不能强制消费者代码不只是启动一个任务,并做的东西:) – 2012-07-17 07:14:21
@TimMahy然后,你似乎必须在抽象中构建上下文,并将其传递到需要的地方。 – casperOne 2012-07-17 11:49:45
正面临着类似的问题。通过任务调用服务。 下面的代码片断解决了。 OperationContext.Current
明确地通过在服务调用完成之前投射由Task
提供的state
变量来设置。
Task<int> taskContactsCount = Task.Factory.StartNew<int>((state) =>
{
int count = 0;
try
{
OperationContext.Current = (OperationContext)state;
TestServiceClient testServiceProxy = new TestServiceClient();
var count = testServiceProxy.GetCount();
}
catch (Exception ex)
{
}
return contactsCount;
}, OperationContext.Current);
- 1. 在任务中保留内存离散
- 2. 并行任务库WaitAny Design
- 3. Quartz.net +任务并行库
- 4. .NET任务并行库
- 5. 任务并行库ArgumentException
- 6. 任务并行库 - 单核并行度
- 7. 任务并行库和多个并行任务
- 8. 在任务并行库:如何推迟Task.TaskFactory.FromAsync任务执行?
- 9. 任何方式来保证所有任务将尝试与任务并行库?
- 10. 使用事务与任务并行库
- 11. 任务并行库中的任务如何影响ActivityID?
- 12. Ant任务只保留JAR中的某些类,并进行依赖性检查?
- 13. 保证并行线程/任务/任务的立即启动
- 14. 在Jenkins中运行并行任务
- 15. 如何使用Ant tar任务并保留文件权限?
- 16. AlertDialog响应的保留任务
- 17. 任务并行库抛出NullReferenceException与IEnumerable
- 18. .net 4.0任务并行库与MPI.NET
- 19. 奇怪的任务并行库InvalidOperationException
- 20. 任务单声道并行库实现?
- 21. 微软的CCR vs任务并行库
- 22. 任务并行库文件句柄
- 23. 不同的使用任务并行库
- 24. 查询任务并行库实现
- 25. 使用任务并行库的事件
- 26. ThreadLocal的聚合和任务并行库
- 27. 如何使用任务并行库
- 28. 任务并行库 - 阻止操作?
- 29. 任务并行库使用帮助
- 30. 任务并行库和异常
谁开始“任务”?消费者?在启动“Task”之前是否执行了抽象程序集的任何代码? – svick 2012-07-16 08:46:40
不,这是问题,消费者开始的任务:( – 2012-07-16 09:07:08