Почему мой SaveFileDialog не появляется при использовании TPL в XBAP с полным доверием? - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть приложение, которое читает файл данных и преобразует его в файл CSV. В идеале я хотел бы, чтобы чтение обрабатывалось в фоновом режиме, пока пользователь выбирает местоположение для сохранения файла .csv, однако SaveFileDialog не отображается, когда .ShowDialog() вызывается из другого потока

void ReadFile(string inputFile)
{
    var readFileTask = Task.Factory.StartNew<string>(() => ReadFile(inputFile));
    var getSaveFileTask = Task.Factory.StartNew<string>(() => GetSaveFile());

    // Wait until both tasks are finished
    Task.WaitAll(new Task[] { readFileTask , getSaveFileTask });

    var data = readFileTask.Result;
    var saveLocation = getSaveFileTask.Result;

    // Save data as CSV file
    Task.Factory.StartNew(() => WriteCsvFile(saveLocation));
}

private string GetSaveFile()
{
    SaveFileDialog sfd = new SaveFileDialog();
    sfd.Filter = "Csv Files|*.csv";
    sfd.Title = "Select location to save file to";

    // This get hit but dialog never appears when called from another thread
    sfd.ShowDialog(); 
    return sfd.FileName;
}

Он отлично работает в обычном приложении WPF, поэтому я предполагаю, что это как-то связано с тем, что это XBAP. XBAP настроен для работы с полным доверием

1 Ответ

4 голосов
/ 27 февраля 2012

Похоже, вам нужно вызвать SaveFileDialog.ShowDialog из потока пользовательского интерфейса.
Попробуйте:

var getSaveFileTask = Task.Factory.StartNew<string>(() => GetSaveFile(), CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());

...