深い抽象化アセンブリのどこかに、OperationContext.Currentからデータを読み取るWCF動作があります。このコードがタスク内から実行されると、OperationContext.Currentは空になります。これは、抽象化アセンブリ内で解決できますか。このアセンブリのすべてのコンシューマーにコードを追加する必要がありますか?
1521 次
3 に答える
3
同様の問題に直面していました。タスクを介してサービスを呼び出していました。次のコードスニペットが機能しました。は、サービスの呼び出しが行われる前に、によって提供される変数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);
于 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
呼び出すこともできます。state
OperationContext
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-16T19:46:02.193 に答える
0
現在のプリンシパルが保存されているように、CallContextに何かを追加するのが唯一の方法のようです...
于 2012-07-18T14:26:51.263 に答える