async/await
次の方法で、同時に TPL とうまく連携する実行コンテキストを探しています (予想される動作)。
async Task<string> ReadContext(string slot)
{
// Perform some async code
...
return Context.Read(slot);
}
(1)仲良く遊ぶasync/await
Context.Store("slot", "value");
await DoSomeAsync();
Assert.AreEqual("value", Context.Read("slot"));
Context.Store("slot", "value");
var value = await ReadContext("slot");
Assert.AreEqual("value", value);
(2)仲良く遊ぶTask.Run()
Context.Store("slot", "value");
var task = Task.Run(() => ReadContext("slot"));
Assert.IsNull(task.Result);
(3)待ちに待った相手と仲良く遊ぶTask
Context.Store("slot", "value");
var value = await Task.Run(() => ReadContext("slot"));
Assert.AreEqual("value", value);
(3)必須ではありませんが、あると便利です。私は今使用していますが、手動で実行されたタスクでも、別のスレッドでのタスクの実行を強制する必要がある実行されたタスクでも、格納されている値にアクセスできるため、 (2)CallContext
で失敗します。Task.Factory.StartNew(..., LongRunning)
それを達成する方法はありますか?