关联.NET异步中的延续

时间:2014-03-19 19:04:06

标签: .net async-await

在.NET异步编程中,我正在寻找一些相关数据,这些数据在具有相同根源的所有异步任务中都是一致的。在最简单的级别,我希望在我的日志记录中记录此相关标识符,以便我可以快速查看异步"线程"活动。

我正在寻找的相关数据是这样的,在下面的代码中,TestCorrelation()中的异常永远不会被抛出:

private T _correlation;

private void TestCorrelation(T correlation)
{
   if (correlation != _correlation) throw new Exception("Ain't it");
}

public async Task MyMethod()
{
    _correlation = someCorrelator;

    await MyMethod2();

    await Task.Run(() =>
    {
        await Task.Delay(1);
        TestCorrelation(someCorrelator);
    });
}

public async Task MyMethod2()
{
    TestCorrelation(someCorrelator);
    await Task.Run(() =>
    {
        await Task.Delay(1);
        TestCorrelation(someCorrelator);
    });
}

异步编程中是否有任何内置(例如Task的属性)会给我这样的相关性?

1 个答案:

答案 0 :(得分:3)

正如@svick所说,你可以使用LogicalCallContext。但是,有两个重要的限制:

  1. 它将 在.NET 4.5完整框架上正常工作。不支持WinStore,.NET 4.0(即使你安装Microsoft.Bcl.Async)等等。在某些框架(特别是.NET 4.0)上,代码将很好地编译但不能正常工作
  2. 您可以存储不可变数据。如果您要存储复杂数据,可能会发现immutable collections很有帮助。我在AsyncDiagnostics project
  3. 中使用了ImmutableStack

    我有详细信息on my blog