4

我们在深度抽象程序集中的某个地方有一个从 OperationContext.Current 读取数据的 WCF 行为,当从任务中执行此代码时,OperationContext.Current 为空,是否可以在抽象程序集中解决这个问题,或者我们会需要向这个程序集的所有消费者添加一些代码吗?

4

3 回答 3

3

面临着类似的问题。正在通过任务调用服务。下面的代码片段解决了。是通过在调用服务完成之前强制转换提供的变量来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);
于 2013-11-12T10:38:41.370 回答
2

在创建Task实例时,您应该使用闭包,如下所示:

// 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.
};

您还可以调用带参数的重载并将StartNew实例传入,在需要时在 中进行转换和使用,如下所示:stateOperationContextTask

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-16T19:46:02.193 回答
0

似乎唯一的方法是向 CallContext 添加一些东西,就像存储当前的 Principal 一样......

于 2012-07-18T14:26:51.263 回答