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 секунд отобразятся все элементы пользовательского интерфейса, включая мой пользовательский элемент управления.
Любое предложение для этой ситуации, пожалуйста?