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

时间:2015-11-02 17:34:58

标签: c# multithreading winforms

基本上FileSystemWatcher更改了列表项的属性,导致List_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_Changed被调用,它再次设置一个属性,最终设置了Form对象的文本。第二个帖子在哪里?

谢谢。

2 个答案:

答案 0 :(得分:4)

此处解释了您的要求FileSystemWatcher.SynchronizingObject Property

  

<强>说明   当SynchronizingObject为null时,将在系统线程池的线程上调用处理Changed,Created,Deleted和Renamed事件的方法。有关系统线程池的更多信息,请参阅ThreadPool。

它还包含解决方案 - 只需将其设置为您的表单或对其进行一些控制,如此

// inside a form
yourFileSystemWatcher.SynchronizingObject = this;

答案 1 :(得分:0)

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