C# 跨线程无效操作异常,但只有一个线程

C# 跨线程无效操作异常,但只有一个线程,c#,multithreading,winforms,C#,Multithreading,Winforms,基本上,FileSystemWatcher更改列表项的属性,从而触发list\u Changed事件: void sounds_ListChanged(object sender, ListChangedEventArgs e) { UnsafedChanges = true; Gui.soundsDataGridView.AutoResizeColumns(); } 异常在此处引发: private bool unsafedchanges = false; public bo

基本上,
FileSystemWatcher
更改列表项的属性,从而触发
list\u Changed
事件:

void sounds_ListChanged(object sender, ListChangedEventArgs e)
{
    UnsafedChanges = true;
    Gui.soundsDataGridView.AutoResizeColumns();
}
异常在此处引发:

private bool unsafedchanges = false;
public bool UnsafedChanges
{
    get
    {
        return unsafedchanges;
    }
    set
    {
        unsafedchanges = value;
        if (!value)
            Gui.Text = soundsXMLFilePath;
        else
            Gui.Text = " * " + soundsXMLFilePath; // thrown here
    }
}
其中,
Gui
是我的windows窗体应用程序的主要形式,由构造函数指定给该代码所在的类

soundsXMLFilePath

public string soundsXMLFilePath {
    get{
        return soundsxmlfilepath;
    }
    set{
        bool changed = soundsxmlfilepath != value;
        soundsxmlfilepath=value;
        if (changed)
            Gui.Text = value;
    }
}
现在我知道了
Invoke
,问题是我不明白为什么会抛出异常:据我所知,只有主线程,因为我想不出在什么地方启动了一个。
FileSystemWatcher
引发一个事件,一个属性被更改,导致调用
List\u changed
,该列表再次只设置一个属性,在该属性中最终设置
表单
对象的文本。第二根线在哪里


谢谢。

您的Windows窗体有一个线程,FileSystemWatcher有一个线程-两个线程。

您的Windows窗体有一个线程,FileSystemWatcher有一个线程-两个线程。

这里解释了您的问题

备注 当SynchronizingObject为null时,将对系统线程池中的线程调用处理更改、创建、删除和重命名事件的方法。有关系统线程池的更多信息,请参阅线程池

它还包含解决方案-只需将其设置为窗体或其上的某个控件,如下所示

// inside a form
yourFileSystemWatcher.SynchronizingObject = this;

这里解释了你的问题

备注 当SynchronizingObject为null时,将对系统线程池中的线程调用处理更改、创建、删除和重命名事件的方法。有关系统线程池的更多信息,请参阅线程池

它还包含解决方案-只需将其设置为窗体或其上的某个控件,如下所示

// inside a form
yourFileSystemWatcher.SynchronizingObject = this;

尝试以下操作:设置确保调试器在异常时中断(调试>异常,检查“公共语言运行时异常”上的“抛出”列),当抛出异常时,查看“调试>窗口>线程”。它是否显示多个线程,更重要的是,调试器是否在非ui线程上停止(ui线程是“主线程”)?我认为FileSystemWatcher会使用线程池中的线程通知您。请尝试以下操作:设置确保调试器在异常时中断(调试>异常,检查“公共语言运行时异常”上的“抛出”列)当抛出异常时,请查看“调试>窗口>线程”。它是否显示多个线程,更重要的是,调试器是否在非ui线程上停止(ui线程是“主线程”)?我认为FileSystemWatcher会通知您使用线程池中的线程。这个答案需要改进。资源?关于它为什么使用不同线程的解释?好吧,这很令人失望。他直接提出的问题是:“第二条线索在哪里?”准确、简洁的答案真的应该得-1分吗?也许VGD需要知道的只是他的实际问题得到了回答?(为我辩护,当我提交我的答案时,伊万的答案不存在,我将取代他的答案。)@MichaelGorsich——好吧,你已经说服我,你的答案不值得投反对票。然而,我的投票似乎是“锁定”的,因为我把它放在了“太久以前”——堆栈溢出的一个特性让我很恼火。无论如何,除非你修改你的问题,否则我不能改变我的投票。@Rory:如果我态度不好,我很抱歉。我真的只是想回答这个问题。雷扎:感谢你的评论:)@MichaelGorsich——不,你的态度并不坏,你的评论让我认真思考。我找不到一个很好的理由来解释为什么一个简洁的答案是“无用的”(当你将鼠标悬停在“向下投票”按钮上时得到的弹出提示),只要它回答了问题并且没有提供错误或误导性的信息。这个答案需要改进。资源?关于它为什么使用不同线程的解释?好吧,这很令人失望。他直接提出的问题是:“第二条线索在哪里?”准确、简洁的答案真的应该得-1分吗?也许VGD需要知道的只是他的实际问题得到了回答?(为我辩护,当我提交我的答案时,伊万的答案不存在,我将取代他的答案。)@MichaelGorsich——好吧,你已经说服我,你的答案不值得投反对票。然而,我的投票似乎是“锁定”的,因为我把它放在了“太久以前”——堆栈溢出的一个特性让我很恼火。无论如何,除非你修改你的问题,否则我不能改变我的投票。@Rory:如果我态度不好,我很抱歉。我真的只是想回答这个问题。雷扎:感谢你的评论:)@MichaelGorsich——不,你的态度并不坏,你的评论让我认真思考。我找不到一个很好的理由来解释为什么一个简洁的答案是“没有用的”(当你把鼠标悬停在“向下投票”按钮上时会得到弹出提示),只要它回答了问题并且没有提供错误或误导性的信息。