Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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# 动作委托和多线程同步_C#_Synchronization - Fatal编程技术网

C# 动作委托和多线程同步

C# 动作委托和多线程同步,c#,synchronization,C#,Synchronization,我有现场公共行动更新;可以由多个线程调用。此外,此字段可以更改为null等。我是否应该创建一个属性并在其中使用lock语句?或者当我设置更新=新操作时。。。它是一个原子操作,不需要锁?在C中设置引用是一个原子操作,因此不需要锁。但是,您应该使更新引用具有易变性,以确保在发生更改时在所有线程中正确刷新更新引用: public volatile Action Update; 不管线程是什么,最好的做法是不直接公开成员,而是使用属性。然后,您需要使属性的备份存储不稳定,这就排除了自动属性: priv

我有现场公共行动更新;可以由多个线程调用。此外,此字段可以更改为null等。我是否应该创建一个属性并在其中使用lock语句?或者当我设置更新=新操作时。。。它是一个原子操作,不需要锁?

在C中设置引用是一个原子操作,因此不需要锁。但是,您应该使更新引用具有易变性,以确保在发生更改时在所有线程中正确刷新更新引用:

public volatile Action Update;
不管线程是什么,最好的做法是不直接公开成员,而是使用属性。然后,您需要使属性的备份存储不稳定,这就排除了自动属性:

private volatile Action update;

public Action Update
{
  get { return update; }
  set { update = value; }
}

遵循Anders的答案,但是如果执行空检查以避免竞争条件,则需要将变量的值临时存储在局部变量中

坏例子:

if(myClass.Update != null)
{
    // Race condition if Update is set to null here by another thread
    myClass.Update();
}
var updateMethod = myClass.Update;
if(updateMethod != null)
{
    // No race condition since we try to call
    // the same value that we checked for null
    updateMethod();
}
好例子:

if(myClass.Update != null)
{
    // Race condition if Update is set to null here by another thread
    myClass.Update();
}
var updateMethod = myClass.Update;
if(updateMethod != null)
{
    // No race condition since we try to call
    // the same value that we checked for null
    updateMethod();
}

谢谢,我觉得我需要这样的东西:-在调用代理之前检查null时,请注意可能的竞争条件。