C# Delegate.BeginInvoke是否需要内存载体? 私有类参数 { 公共对象参数1; 公共对象参数2; } 私有静态void Main(字符串[]args) { 动作动作=线程动作; var myParamDatas=新的ParamDatas(); var result=action.BeginInvoke(myParamDatas,null,null); //做某事。。。 } 私有静态void ThreadAction(ParamDatas ParamDatas) { Thread.MemoryBarrier(); //使用参数数据。。。。 //var param1=paramDatas.param1; }

C# Delegate.BeginInvoke是否需要内存载体? 私有类参数 { 公共对象参数1; 公共对象参数2; } 私有静态void Main(字符串[]args) { 动作动作=线程动作; var myParamDatas=新的ParamDatas(); var result=action.BeginInvoke(myParamDatas,null,null); //做某事。。。 } 私有静态void ThreadAction(ParamDatas ParamDatas) { Thread.MemoryBarrier(); //使用参数数据。。。。 //var param1=paramDatas.param1; },c#,thread-safety,begininvoke,C#,Thread Safety,Begininvoke,此代码中是否需要内存载体? 或者BeginInvoke功能将避免脏数据?是的,需要使用内存载体(或监视器/锁)。您必须使用同步机制来提供自己的线程安全保证 调用委托是线程安全的,因为它是不可变的,但委托引用的方法的执行不是线程安全的 直接引自关于线程安全的文章:“此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。 我希望这对您有所帮助!在您调用BeginInvoke时,您正在获取一份myParamDatas的副本,并将该数据的副本发送给

此代码中是否需要内存载体?
或者BeginInvoke功能将避免脏数据?

是的,需要使用内存载体(或监视器/锁)。您必须使用同步机制来提供自己的线程安全保证

调用委托是线程安全的,因为它是不可变的,但委托引用的方法的执行不是线程安全的

直接引自关于线程安全的文章:“此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。


我希望这对您有所帮助!

在您调用
BeginInvoke
时,您正在获取一份
myParamDatas
的副本,并将该数据的副本发送给函数调用。您不需要任何内存障碍或同步机制来正确提供该值。同样,变量或其val的任何突变ue,在该函数调用之前,需要在读取值之前执行该函数调用,因为该点上的值读取与这些更改在同一线程上,因此需要按顺序进行观察。这意味着如果在调用
BeginInvoke
之前为该对象设置了任何值,则这些值将在调用的函数中可见n

如果在调用
BeginInvoke
(在调用线程上)后对引用对象进行任何更改,则需要适当的同步机制,以确保这些更改与来自另一个线程的对象的使用正确同步

private class ParamDatas
{
    public object Param1;
    public object Param2;
}

private static void Main(string[] args)
{
    Action<ParamDatas> action = ThreadAction;
    var myParamDatas = new ParamDatas();
    var result = action.BeginInvoke(myParamDatas, null, null);

    // dosomething ...
}

private static void ThreadAction(ParamDatas paramDatas)
{
    Thread.MemoryBarrier();

    // use paramDatas ....
    // var param1 = paramDatas.Param1;
}