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に実行されるを起動する場合は、必要な値をから別の構造にコピーして、処理のためにそれらをに渡す必要があります。OperationContextTask

于 2012-07-16T19:46:02.193 に答える
0

現在のプリンシパルが保存されているように、CallContextに何かを追加するのが唯一の方法のようです...

于 2012-07-18T14:26:51.263 に答える