C# 线程安全快速整数

C# 线程安全快速整数,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,所以我有一个类,它包含3个计数器: public class Files { private static ObservableCollection<Files> _files = new ObservableCollection<Files>(); private static int _inProcess; private static int _finished; private sta

所以我有一个
,它包含3个计数器:

    public class Files
    {
        private static ObservableCollection<Files> _files = new ObservableCollection<Files>();
        private static int _inProcess;
        private static int _finished;
        private static int _inQueue;

        public static ObservableCollection<Files> List
        {
            get { return _files ; }
            set { _files = value; }
        }

        public static int InProcess
        {
            get { return _inProcess; }
            set
            {
                _inProcess = value;
            }
        }

        public static int Finished
        {
            get { return _finished; }
            set
            {
                _finished = value;
            }
        }

        public static int InQueue
        {
            get { return _inQueue; }
            set
            {
                _inQueue = value;
            }
        }
}
但我犯了这个错误:

属性或索引器不能作为out或ref参数传递

这很好:

Files.InProcess++;

如何修复它?

错误非常简单。不能将属性作为ref传递。在这种情况下,最好的选择是创建一个方法

publicstaticvoid IncrementInProcess()
{
联锁增量(过程中参考);

}

…那你的问题是什么呢?不言自明。@DannyNitman如果你想编写无锁多线程程序,你真的需要知道你在做什么。如果您不熟悉C#中有关内存管理的许多非常复杂的规则,那么您最终将编写无法运行的程序。“属性不是变量。它们是方法,不能传递给ref参数。”:@MongZhu我认为保护一个局部变量没有什么意义。我可以把它放在我的Files类中,_inProcess是这个类的成员吗?@DannyNitman是的。在这里,您的属性是毫无意义的,因为get和set都是公共的,并且在这两种情况下都没有进行检查。您应该a)根本不使用它们,或者b)使用自动实现的属性
Files.InProcess++;