CommonFileDialog загружает в другой поток - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь создать диалог из WindowsAPICodePack в C #, но при загрузке выдает исключение, что вызывающий поток не может получить доступ к объекту.

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-файла.Как создать диалог в одной и той же теме?

1 Ответ

0 голосов
/ 10 февраля 2019

Немного поиграв с пакетом WindowsAPICodePack (1.1.0), я могу воспроизвести проблему, если вызову метод 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(...) произойдет сбой со следующим исключением:

System.InvalidOperationException: 'Вызывающий поток не может получить доступ к этому объекту, поскольку он принадлежит другому потоку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...