Как получить диски, папки или файлы в асинхронном режиме с .NET 4.5 или более поздней версии? - PullRequest
0 голосов
/ 10 июня 2019

EDITED

Я разработал WPF UserControl, который используется для вывода списка дисков. Однако некоторые накопители являются сетевыми хранилищами (например, NAS) и могут находиться в спящем режиме. И затем доступ к этим дискам происходит очень медленно (время отклика превышает 10 секунд в первый раз). Поэтому я хочу, чтобы мой UserControl отображал индикатор выполнения или что-то еще, чтобы замечать пользователя «Я не разбился», а не позволял им ждать ответа GUI в течение 10 секунд.

Согласно предложению @ TheGeneral, я использую async / await для своего решения, код выглядит так:

private async Task refreshDriveAsync()
{
    DriveInfo[] drives = await Task.Run(() => DriveInfo.GetDrives());
    //do my stuff here
}

А абонент выглядит так:

//void is not good, but there's no error handling, so it's might ok here
public async void Refresh()
{
    //some stuff
    await refreshDriveAsync();
    //some more stuff
}

После показа UserControl он должен вызвать Refresh() один раз. Поэтому я написал такую ​​часть кода:

public MyUserControl()
{
    Window w = this.GetParentWindow();    //my own extension method
    if (window != null)
        window.Loaded += ((t, e) => Refresh());
}

Мой ожидаемый результат: 1. Окно показано. 2. Мой пользовательский элемент управления не готов, но я могу показать уведомление. 3. Через 10 секунд пользовательский элемент управления получит диски и обновит их содержимое.

Однако реальный мир это: 1. Окно отображается, но без каких-либо элементов пользовательского интерфейса. 2. Через 10 секунд отобразятся все элементы пользовательского интерфейса, включая мой пользовательский элемент управления.

Любое предложение для этой ситуации, пожалуйста?

1 Ответ

0 голосов
/ 10 июня 2019

Просто разгрузить до Task.Run и await, что.

var drives = await Task.Run(() => DriveInfo.GetDrives());

В основном это разгрузит рабочую нагрузку в поток пула потоков и создаст продолжение в контексте пользовательского интерфейса. Есть и другие способы сделать это, однако это освободит пользовательский интерфейс (за счет потока пула потоков)

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