将OperationContext保留在任务并行库中

时间:2012-07-16 07:54:04

标签: .net wcf task-parallel-library operationcontext

我们在深度抽象集合中有一个WCF行为,它从OperationContext.Current读取数据,当从Task中执行此代码时,OperationContext.Current为空,是否有可能在抽象程序集中解决这个问题或者我们是否需要向此程序集的所有使用者添加一些代码?

3 个答案:

答案 0 :(得分:2)

遇到了类似的问题。通过Task调用服务。 以下代码片段已经解决了。 OperationContext.Current是在完成对服务的调用之前,通过转换stateTask提供的变量来明确设置的。

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 ...