我正在实现一个将从多个线程并发使用的类.大多数属性获取并设置原始类型,Interlocked类可以正确处理它们.该课程包括Guid属性.这不是直接以线程安全的方式实现的.这是你如何实现该属性?提前致谢.
private Byte[] _activityId;
public Guid ActivityId
{
get { return new Guid(this._activityId); }
set
{
Byte[] bytes = value.ToByteArray();
Interlocked.Exchange(ref this._activityId, bytes);
}
}
Run Code Online (Sandbox Code Playgroud)
更新:所以到目前为止唯一提出的解决方案不包括使用任何"线程"类或结构.所以我将提出我已在评论中提出的问题:
我的理解是引用/原始值类型分配是原子的,但是Interlocked将保证更改传播到所有线程.如果我们只是简单地分配值,为什么Interlocked会公开API以交换引用类型和原始值?
我认为你可以使用其他重载Interlocked.Exchange:
private volatile object _activityId; // Yes, object :)
public Guid ActivityId {
get { return (Guid)_activityId; }
set { _activityId = value; }
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为Guid现在已装箱,并且引用类型的分配是原子的。