Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CommonFileDialog在不同线程中加载_C#_Dialog_Windows Api Code Pack - Fatal编程技术网

C# CommonFileDialog在不同线程中加载

C# CommonFileDialog在不同线程中加载,c#,dialog,windows-api-code-pack,C#,Dialog,Windows Api Code Pack,我正试图从C#中的WindowsAPICodePack创建一个对话框,但当它加载时,会引发一个异常,即调用线程无法访问该对象 Exception: System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it. at System.Windows.Threading.Dispatcher.VerifyAccess() a

我正试图从C#中的WindowsAPICodePack创建一个对话框,但当它加载时,会引发一个异常,即调用线程无法访问该对象

Exception: System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it.
   at System.Windows.Threading.Dispatcher.VerifyAccess()
   at System.Windows.Window.get_CriticalHandle()
   at System.Windows.Interop.WindowInteropHelper.get_CriticalHandle()
   at Microsoft.WindowsAPICodePack.Dialogs.CommonFileDialog.ApplyNativeSettings(IFileDialog dialog)
   at Microsoft.WindowsAPICodePack.Dialogs.CommonFileDialog.ShowDialog()
创建异常的代码:

CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.IsFolderPicker = true;
CommonFileDialogResult result = dialog.ShowDialog();

我尝试使用Dispatcher.Invoke,但它仍然生成相同的错误。如果我使用常规的BrowserFolderDialog类,它会加载,但很可能这个类不会加载,因为它来自不同的.dll文件。如何在同一线程中创建对话框?

在使用
WindowsAPICodePack
package(1.1.0)后,如果从UI以外的线程调用
CommonOpenFileDialog.ShowDialog()
方法,我可以重现该问题

我看到您提到您尝试了
Dispatcher.Invoke()
方法,但实际上对我有效,请尝试此示例以确认:

using Microsoft.WindowsAPICodePack.Dialogs;
...
private void Button_Click(object sender, RoutedEventArgs e)
{
    System.Threading.Tasks.Task.Factory.StartNew(() =>
    {
        Dispatcher.Invoke(() =>
        {
            CommonOpenFileDialog dialog = new CommonOpenFileDialog();
            dialog.IsFolderPicker = true;
            CommonFileDialogResult result = dialog.ShowDialog();
        });
    });
}
另一方面,如果不使用
Dispatcher.Invoke(…)
,则会失败,出现以下异常:

CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.IsFolderPicker = true;
CommonFileDialogResult result = dialog.ShowDialog();
System.InvalidOperationException:'调用线程无法访问 此对象是因为拥有它的线程不同


在使用
WindowsAPICodePack
pack(1.1.0)后,如果从UI以外的线程调用
CommonOpenFileDialog.ShowDialog()
方法,我可以重现该问题

我看到您提到您尝试了
Dispatcher.Invoke()
方法,但实际上对我有效,请尝试此示例以确认:

using Microsoft.WindowsAPICodePack.Dialogs;
...
private void Button_Click(object sender, RoutedEventArgs e)
{
    System.Threading.Tasks.Task.Factory.StartNew(() =>
    {
        Dispatcher.Invoke(() =>
        {
            CommonOpenFileDialog dialog = new CommonOpenFileDialog();
            dialog.IsFolderPicker = true;
            CommonFileDialogResult result = dialog.ShowDialog();
        });
    });
}
另一方面,如果不使用
Dispatcher.Invoke(…)
,则会失败,出现以下异常:

CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.IsFolderPicker = true;
CommonFileDialogResult result = dialog.ShowDialog();
System.InvalidOperationException:'调用线程无法访问 此对象是因为拥有它的线程不同


我们可以看到生成异常的代码吗?我将代码添加到问题中,谢谢,但我也指周围的代码(即调用CommonOpenFileDIalog的函数)。这是UWP、WPF还是WinForms应用程序?我们能看看生成异常的代码吗?我在问题中添加了代码谢谢,但我指的是周围的代码(即调用CommonOpenFileDIalog的函数)。这是UWP、WPF还是WinForms应用程序?谢谢您的回答。这不起作用,但我想我现在更明白问题所在。我以前在自己创建的一个新线程中遇到过它。新线程直到稍后才会执行。它将在启动新线程并生成异常之前调用下一个方法。谢谢您的回答。这不起作用,但我想我现在更明白问题所在。我以前在自己创建的一个新线程中遇到过它。新线程直到稍后才会执行。它在启动新线程并生成异常之前调用下一个方法。