Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 同时使用WeakReference<;T>;?_C#_.net_Thread Safety_Weak References - Fatal编程技术网

C# 同时使用WeakReference<;T>;?

C# 同时使用WeakReference<;T>;?,c#,.net,thread-safety,weak-references,C#,.net,Thread Safety,Weak References,的文档具有螺纹安全的通用样板: 此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的不保证任何实例成员是线程安全的 但是,我想知道使用WeakReference的实例成员是否确实安全 特别是,我想知道允许并发访问以下内容是否安全: class MyRef<T> where T : class { private readonly Func<Task<T>> _fetcher; private readonly WeakRe

的文档具有螺纹安全的通用样板:

此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的不保证任何实例成员是线程安全的

但是,我想知道使用WeakReference的实例成员是否确实安全

特别是,我想知道允许并发访问以下内容是否安全:

class MyRef<T> where T : class
{
    private readonly Func<Task<T>> _fetcher;
    private readonly WeakReference<T> _wref;

    public MyRef(Func<Task<T>> fetcher, T target = null)
    {
        _fetcher = fetcher;
        _wref = new WeakReference<T>(target);
    }

    public async Task<T> GetTargetAsync()
    {
        T target;

        if (!_wref.TryGetTarget(out target))
        {
            target = await _fetcher();
            _wref.SetTarget(target);
        }

        return target;
    }
}
class MyRef,其中T:class
{
专用只读函数取数器;
私有只读WeakReference;
公共MyRef(Func获取程序,T target=null)
{
_取数器=取数器;
_wref=新的WeakReference(目标);
}
公共异步任务GetTargetAsync()
{
T靶;
如果(!_wref.TryGetTarget(超出目标))
{
target=wait_fetcher();
_wref.SetTarget(目标);
}
回报目标;
}
}
这里使用和,可能由多个线程并发调用

它们都在调用由本机代码实现的私有外部
Target
属性。()

在我开始使用同步锁保护上面的代码之前,我想知道本机实现对于并发访问是否真的不安全


什么对我来说是安全的?

简单地说,如果我可以使用上面的代码,而不会由于并发调用这两个方法而导致任何意外的异常或访问冲突

更明确地说:

  • TryGetTarget
    将返回
    true
    并给我一个非空引用;或
    false
    。没有例外

  • SetTarget
    不会导致任何异常

通过查看,我们可以看到
WeakTarget
/
WeakTarget
的内部方法在
weakReferenceEnable
/
weakReferenceofNative
类中实现。查看它们,我们可以看到,在中(由
目标设置器使用)和中,
目标设置器和
目标设置器使用,
getter和
TryGetTarget
都有一个
AcquireWeakhandRespinlock

因此,可能整个
Target
/
TryGetTarget
都是线程安全的(,因为它们不会损坏.NET的内部结构),但您需要一个比我更好的程序员来检查它们是否真的是:-)


显然,使用
Target
/
TryGetTarget
不会使目标对象线程安全!这是另一个问题

定义你所说的“这里安全”是什么意思。“线程安全”并不是一个普遍认可的笼统概念。只有当它达到你的期望时,它才会对你安全。您希望或期望它做什么?@LasseV.Karlsen请查看我最近的编辑以获得澄清。的文档底部有这样一条:“此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。任何实例成员都不能保证线程安全。”(我的重点是)因此不,你不能保证它不会崩溃。@LasseV.Karlsen是的,我知道。这就是为什么我在这个问题的最顶端引用了这句话。我想知道具体的实施细节。你不应该。有文件证明是不安全的,实施是无关的。它现在可能是安全的,但在下一个.NET修补程序或主要版本后可能不安全。请注意,此答案指的是.NET核心实现,而不是“旧的”.NET(如果您仍在使用ASP.NET)。