【发布时间】:2012-08-27 16:13:49
【问题描述】:
我正在编写一个多线程应用程序,其中一部分代码必须是线程安全的才能跟踪任务编号。
我有这个方法:
private void IncrementTaskNumber() {
Interlocked.Increment(ref _TaskNumber);
}
_TaskNumber 是同一类中的私有 int。问题是,这会引发“A 属性、索引器或动态成员访问可能不会作为 out 或 ref 参数传递”异常。 为了解决这个问题,我这样做:
private void IncrementTaskNumber() {
int _taskNum = _TaskNumber;
Interlocked.Increment(ref _taskNum);
_TaskNumber = _taskNum;
}
这仍然是线程安全的吗?
【问题讨论】:
-
请显示
_TaskNumber的声明。鉴于错误消息,听起来它被定义为private int _TaskNumber { get; set; }之类的东西 - 对吗? -
@Reed Copsey,是的,私人 int _TaskNumber {get;设置;}
-
您需要使用字段,而不是私有属性 - 详情请参阅我的回答。
标签: c# multithreading