gpt4 book ai didi

c# - 一次访问字段的最佳线程安全方式,即用于处理

转载 作者:太空宇宙 更新时间:2023-11-03 10:28:49 26 4
gpt4 key购买 nike

基本上我想确保类中的字段(在本例中为 _changedPoller)在不再需要时尽早处理。我在类的 Dispose 方法中调用 StopChangedPolling 并在某些事件发生时调用。仅处理一次字段的最佳线程安全方法是什么?下面的代码可以吗?

private void StopChangedPolling()
{
IDisposable changedPoller = Interlocked.CompareExchange(ref _changedPoller, null, _changedPoller);
if (changedPoller != null)
changedPoller.Dispose();
}

第二次调用时,_changedPoller 为 null 并且没有抛出异常,即使文档指出如果 location1 的地址为空指针则抛出 ArgumentNullException。

最佳答案

您传递的不是空指针,而是对空引用的引用。我认为你不能引发异常

The address of location1 is a null pointer.

在 C# 中,因为您无法在 C# 中创建空托管指针。

这是线程安全的,但在线程中止的情况下将无法处理。如果这不是您关心的问题,那么这很好。

您可以考虑使用锁来简化此代码,但实际上我认为这比锁更简单。

您也可以使用 Interlocked.Exchange

实际上,有一个问题:您正在以一种不同步的方式读取 _changedPoller。我不确定 ECMA 和 .NET CLR 对此有何保证。我将不得不阅读规范。 volatile 会解决这个问题。如果没有其他此类读取用法,Interlocked.Exchange 也会修复它。

关于c# - 一次访问字段的最佳线程安全方式,即用于处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30918122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com