我们在深度抽象集合中有一个WCF行为,它从OperationContext.Current读取数据,当从Task中执行此代码时,OperationContext.Current为空,是否有可能在抽象程序集中解决这个问题或者我们是否需要向此程序集的所有使用者添加一些代码?
答案 0 :(得分:2)
遇到了类似的问题。通过Task调用服务。
以下代码片段已经解决了。 OperationContext.Current
是在完成对服务的调用之前,通过转换state
由Task
提供的变量来明确设置的。
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 :(得分:1)
在您创建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.
};
您还可以调用带有state
参数的overload of StartNew
并传递OperationContext
instance,然后在Task
中投射并使用它,如下所示:< / p>
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
进行处理。
答案 2 :(得分:0)
似乎唯一的方法是向CallContext添加一些东西,就像存储当前的Principal ...