类似于AsyncLocal <t>的功能,可在等待期间复制,但不会复制新任务

时间:2018-10-04 13:41:04

标签: c# .net async-await

我正在为NLog创建包装器类。我想捕获跨日志条目的逻辑执行流。传统上,我们可以通过线程id来完成;但是,这对于异步代码变得毫无用处,因为另一个线程可以在await之后接受执行。因此,我试图介绍在await调用中保留的另一个字段。

AsyncLocal<T>满足此要求。但是,当通过Task.Run产生新任务时,也会复制它,因此由于它在并发线程之间共享而降低了它的有用性。是否有一些功能可以保留await上的字段,但不能保留Task.Run上的字段?我不介意加入并发任务(例如await Task.WhenAll)时会发生什么。

我希望这可以通过包装类集中完成,而不是复制到所有Task.Run调用中。

var asyncLocal = new AsyncLocal<string>();
asyncLocal.Value = "Test";

await Task.Yield();
Console.Write(asyncLocal.Value ?? "null");   // should be "Test"

await Task.Run(() =>
{
    Console.WriteLine(asyncLocal.Value ?? "null");   // should be "null"
});

0 个答案:

没有答案