c++/cli c#winforms跨线程操作有时是可能的

c++/cli c#winforms跨线程操作有时是可能的,c#,multithreading,winforms,c++-cli,C#,Multithreading,Winforms,C++ Cli,我正在使用c++/cli(也应适用于c#)并创建winforms程序 我有一些在DataGridView中编辑数据的代码行。代码由FileSystemWatcher事件执行,但也可以由后台工作线程或简单线程执行。但是,它不是由UI线程执行的。 DGV放置在TabControl的选项卡上。当代码在DGV CONTAIN选项卡具有焦点的情况下执行时,代码将失败,出现众所周知的预期异常“Cross thread operation not valid” 但是,当另一个选项卡具有焦点时,代码将顺利执行。

我正在使用c++/cli(也应适用于c#)并创建winforms程序

我有一些在DataGridView中编辑数据的代码行。代码由FileSystemWatcher事件执行,但也可以由后台工作线程或简单线程执行。但是,它不是由UI线程执行的。
DGV放置在TabControl的选项卡上。当代码在DGV CONTAIN选项卡具有焦点的情况下执行时,代码将失败,出现众所周知的预期异常“Cross thread operation not valid”

但是,当另一个选项卡具有焦点时,代码将顺利执行。我假设DGV在未显示时未更新,导致代码在本例中运行良好。但这意味着向消息队列发送WM_PAINT之类的消息取决于DGV的可见性(显示或不显示),如果不可见,则必须在DGV再次显示时发送这些消息

这是正确的吗?

当DGV(未)显示时,代码执行有什么区别?

您的代码基本上是错误的,但这并不意味着您一定会得到提醒。当控件不可见时,它不会爆炸,不需要更新它,所以不需要做任何线程不安全的事情,所以没有例外

您必须解决潜在问题。这房子很容易处理。只需在表单构造函数中设置它。现在,事件在UI线程上自动引发,您可以在控件属性上参与,而无需敲打关节。修正:

    MyForm(void)
    {
        InitializeComponent();
        fileSystemWatcher1->SynchronizingObject = this;
    }

假设您将FSW从工具箱中删除到表单中。根据需要进行调整。

您的代码基本上是错误的,但这并不意味着您一定会得到提醒。当控件不可见时,它不会爆炸,不需要更新它,所以不需要做任何线程不安全的事情,所以没有例外

您必须解决潜在问题。这房子很容易处理。只需在表单构造函数中设置它。现在,事件在UI线程上自动引发,您可以在控件属性上参与,而无需敲打关节。修正:

    MyForm(void)
    {
        InitializeComponent();
        fileSystemWatcher1->SynchronizingObject = this;
    }

假设您将FSW从工具箱中删除到表单中。根据需要进行调整。

您的代码基本上是错误的,但这并不意味着您一定会得到提醒。当控件不可见时,它不会爆炸,不需要更新它,所以不需要做任何线程不安全的事情,所以没有例外

您必须解决潜在问题。这房子很容易处理。只需在表单构造函数中设置它。现在,事件在UI线程上自动引发,您可以在控件属性上参与,而无需敲打关节。修正:

    MyForm(void)
    {
        InitializeComponent();
        fileSystemWatcher1->SynchronizingObject = this;
    }

假设您将FSW从工具箱中删除到表单中。根据需要进行调整。

您的代码基本上是错误的,但这并不意味着您一定会得到提醒。当控件不可见时,它不会爆炸,不需要更新它,所以不需要做任何线程不安全的事情,所以没有例外

您必须解决潜在问题。这房子很容易处理。只需在表单构造函数中设置它。现在,事件在UI线程上自动引发,您可以在控件属性上参与,而无需敲打关节。修正:

    MyForm(void)
    {
        InitializeComponent();
        fileSystemWatcher1->SynchronizingObject = this;
    }


假设您将FSW从工具箱中删除到表单中。根据需要进行调整。

很难给出代码在没有代码段的情况下运行的确切原因。执行更新的代码是在后台工作程序中还是在这些行中?该代码由FileSystemWatcher事件执行,但基本上与由后台工作程序或线程执行的代码相同。很难给出代码在没有代码段的情况下运行的确切原因。执行更新的代码是在后台工作程序中还是在这些行中?该代码由FileSystemWatcher事件执行,但基本上与由后台工作程序或线程执行的代码相同。很难给出代码在没有代码段的情况下运行的确切原因。执行更新的代码是在后台工作程序中还是在这些行中?该代码由FileSystemWatcher事件执行,但基本上与由后台工作程序或线程执行的代码相同。很难给出代码在没有代码段的情况下运行的确切原因。执行更新的代码是在后台工作程序中还是类似的?该代码由FileSystemWatcher事件执行,但基本上与由后台工作程序或线程执行的代码相同。为什么它从根本上是错误的,根本问题是什么?除了不通过调用访问DGV之外,还有其他错误吗?我打算使用调用来解决这个问题,所以我知道它失败的原因。我更多的是问“有时崩溃”的原因。尽管如此,还是要感谢您指出这个简单的解决方案。但是请回答这个问题。当您不使用SynchronizingObject属性时,FSW会在工作线程上引发其事件。不允许工作线程直接更新UI,只有从UI线程更新才合法。或者换句话说,控件不是线程安全的。除了同步对象之外,使用表单的BeginInvoke()方法是另一种解决方法。我知道FSW在另一个线程上运行,并且只允许从UI线程更新UI控件。我不想被告知当DGV可见时它为什么会失败(因为我已经知道了)。我想知道当DGV未显示时,为什么它不会失败。这件事有什么不同?我在第一段解释过。这不是visi