C# 多线程访问变量

C# 多线程访问变量,c#,multithreading,variables,C#,Multithreading,Variables,我正在尝试从两个线程访问列表框。我使用了两个lock语句,但这不起作用 我的代码: public partial class Form1 : Form { private List<LogInfo> logs = new List<LogInfo>(); private static Object lockObj = new Object(); private static Object lockObj0 =

我正在尝试从两个线程访问列表框。我使用了两个lock语句,但这不起作用

我的代码:

   public partial class Form1 : Form
   {
        private List<LogInfo> logs = new List<LogInfo>();

        private static Object lockObj = new Object();
        private static Object lockObj0 = new Object();

        /* ... */

        void fileSystemWatcher_Renamed(object sender, RenamedEventArgs e)
        {
            try
            {
                ToggleWatcher(false);
                LogInfo logInfo = new LogInfo(e.ChangeType, GetCurrentTime(), e.FullPath, e.OldName, e.Name);
                lock (lockObj)
                {
                    logs.Add(logInfo);
                    listBox1.Items.Add(logInfo.ToString());
                }
            }
            finally
            {
                ToggleWatcher(true);
            }
        }

        void fileSystemWatcher_Detect(object sender, FileSystemEventArgs e)
        {
            try
            {
                ToggleWatcher(false);
                LogInfo logInfo = new LogInfo(e.ChangeType, GetCurrentTime(), e.FullPath);
                lock (lockObj)
                {
                    logs.Add(logInfo);


                    // Here in below line i get error: invalidoperationexception was unhandled
                    listBox1.Items.Add(logInfo.ToString());
                }
            }
            finally
            {
                ToggleWatcher(true);
            }
        }
    }
公共部分类表单1:表单
{
私有列表日志=新列表();
私有静态对象lockObj=新对象();
私有静态对象lockObj0=新对象();
/* ... */
void fileSystemWatcher_重命名(对象发送方,重命名为ventargs e)
{
尝试
{
切换观察者(假);
LogInfo LogInfo=new LogInfo(e.ChangeType,GetCurrentTime(),e.FullPath,e.OldName,e.Name);
锁(lockObj)
{
logs.Add(logInfo);
listBox1.Items.Add(logInfo.ToString());
}
}
最后
{
切换观察者(真);
}
}
无效fileSystemWatcher\u检测(对象发送方、FileSystemEventTargets e)
{
尝试
{
切换观察者(假);
LogInfo LogInfo=新的LogInfo(e.ChangeType,GetCurrentTime(),e.FullPath);
锁(lockObj)
{
logs.Add(logInfo);
//在下面的一行中,我得到一个错误:invalidoperationexception未处理
listBox1.Items.Add(logInfo.ToString());
}
}
最后
{
切换观察者(真);
}
}
}
我不知道为什么它不工作(我有两个lock语句),但我得到了一个错误:invalidoperationexception未处理


我试图将lockObj更改为static或使用Monitor类,但仍然出现相同的错误

您没有说明异常消息是什么,但我认为问题在于您试图从另一个线程访问UI(当您将项添加到
列表框1
)。它与锁定无关;只是只允许UI线程访问UI。如果需要执行此操作,则必须在UI线程上使用
Invoke

this.Invoke(new Action(() => listBox1.Items.Add(logInfo.ToString())));

另外,请注意,锁定和调用UI线程上的操作代价高昂;当您处理来自
FileSystemWatcher
的事件时,必须尽可能快地处理,否则会有
FileSystemWatcher
的缓冲区溢出和错过事件的风险。一种常见的方法是将事件附加到事件处理程序中的线程安全集合,然后在另一个线程上处理它们。

为什么要进行向下投票?我说错什么了吗?谢谢,我会试试的(我没有点击downvote)