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;
}