Я новичок в Winforms, поступающих из Интернета, и я пытаюсь настроить асинхронные вызовы.Winforms асинхронная задача, запускать несколько потоков одновременно без блокировки UI
У меня есть раскрывающийся список, который я бы назвал некоторыми методами для обновления 3 вкладок на моей странице. Я хотел бы сделать это асинхронно, чтобы он не блокировал пользовательский интерфейс и не помещал сообщение «Загрузка ...» на каждой вкладке и загружал их независимо друг от друга, при этом пользователь мог еще щелкнуть каждую вкладку и см. ход загрузки.
У меня есть следующее, однако это все еще блокирует пользовательский интерфейс, может ли кто-нибудь указать мне в правильном направлении, где я ошибаюсь?
Это мой выпадающий обработчик события
private async void ddlRoles_SelectedIndexChanged(object sender, EventArgs e)
{
await Task.Run(async() =>
{
await setTab1();
});
await Task.Run(async() =>
{
await setTab2();
});
await Task.Run(async() =>
{
await setTab3();
});
}
Это пример одного из моих задач, которые я хотел бы работать асинхронно.
private async Task setTab1()
{
if (tabl1Panel.InvokeRequired)
{
this.Invoke(new MethodInvoker(async delegate()
{
await setTab1();
}));
return;
}
// LONG RUNNING CODE HERE...
}
@x ... нет, это не тот. Рекурсия не вызывает проблем с пользовательским интерфейсом. В ожидании задачи в потоке пользовательского интерфейса, которая сама пытается запустить код в уже заблокированном потоке пользовательского интерфейса (с помощью Invoke), является проблема –
Не используйте потоки, вы вряд ли будете заниматься интенсивной работой с ЦП. Слово «Загрузка» означает, что вы выполняете операции ввода-вывода, и в этом случае вы должны выполнять асинхронный одиночный поток. – Aron