布尔标志跨越异步边界的线程安全性

时间:2020-02-05 07:42:44

标签: c# async-await thread-safety

以下情况可以假定为事实上的线程安全吗? bool标志始终以false开头,只有一种变为true或保持原样。 我知道它实际上不是线程安全的,但是否有可能真的以某种方式破坏?

在这种情况下,异步执行甚至是严格排序的,并且永远不会并行执行。

bool cancelled = false;

await MyAsyncJob.Process(() =>
{
    if (timeout)
    {
        cancelled = true;
    }
});

if (cancelled)
{
    DoSomething();
}

1 个答案:

答案 0 :(得分:1)

以下情况可以假定为事实上的线程安全吗?布尔标志...

不清楚您指的是哪个标志。

在您的代码中,cancelled标志将按您期望的方式工作,因为会在设置await的方法被检查后进行检查。在await之后运行的代码将看到由等待的方法引起的所有副作用。

但是,timeout看起来根本不是线程安全的。期待的代码检查timeout,但是(可能)没有await使用任何集合 timeout的代码。

您可能会遇到使用锁之类的麻烦,也可以针对这种情况使用.NET框架提供的CancellationTokenSourceCancellationTokenOperationCanceledException:< / p>

try
{
  await MyAsyncJob.Process(() =>
  {
    cancellationToken.ThrowIfCancellationRequested();
  });
}
catch (OperationCanceledException)
{
  DoSomething();
}

通过遵循standard pattern,其他开发人员将能够更快地理解您的代码。而且,您完全不必担心线程安全性。所提供的框架类型会解决这个问题。