Как я могу узнать, запущена ли уже асинхронная (ожидаемая) операция и ожидает ли она завершения в приложении. У меня есть две кнопки в представлении, каждая из которых привязана к двум разным асинхронным методам. Если нажата кнопка 1, асинхронный запуск запускается и ждет результата. И в то время, если кнопка2 нажата. Мне нужно показать сообщение о том, что уже запущен асинхронный метод, и остановить выполнение второго асинхронного метода. Как я могу достичь этого?
Как обрабатывать несколько асинхронных методов при запуске?
comment
Можно ли отменить выполняемые вами асинхронные операции?
- person Peter Ritchie   schedule 11.03.2015
Ответы (3)
Сохраните задачу и проверьте наличие свойства IsCompleted
.
private Task pendingTask = Task.FromResult(0);
private async void Button1Click()
{
if (!pendingTask.IsCompleted)
{
//Notify the user
return;
}
pendingTask = DoSomethingAsync();
await pendingTask;
...
}
private async void Button2Click()
{
if (!pendingTask.IsCompleted)
{
//Notify the user
return;
}
pendingTask = DoSomethingElseAsync();
await pendingTask;
...
}
Как отметил @Peter Ritchie в комментариях, лучше отключить другую кнопку, когда ожидается асинхронная операция. Вы можете рассмотреть возможность его использования.
person
Sriram Sakthivel
schedule
11.03.2015
отключение кнопки для запуска задачи кажется лучшей идеей; вы не можете нажать кнопку, которая отключена. Если вы можете, задача выполнена.
- person Peter Ritchie; 11.03.2015
@PeterRitchie Да, очень хорошая идея. Нуб, рассмотри это как лучшую альтернативу.
- person Sriram Sakthivel; 11.03.2015
Я хотел бы показать сообщение типа «Уже запущено» при нажатии второй кнопки. Если кнопка отключена, я не смогу поймать это событие. Подход, упомянутый Шрирамом, кажется прекрасным. Позвольте мне сначала попробовать это.
- person TutuGeorge; 12.03.2015
Task
класс имеет Status
свойство, которое можно использовать для оценки того, запущена ли асинхронная операция, завершена ли она или даже находится ли она в состоянии сбоя.
person
Matías Fidemraizer
schedule
11.03.2015
Вы можете сохранить выполненный Task
внутри своей формы и найти его свойство Status
:
public class Form1
{
private Task fooTask = Task.FromResult(0);
public Task FooAsync()
{
return Task.FromResult(0);
}
public async void MyEventHandler(object sender, EventArgs e)
{
if (fooTask.Status == TaskStatus.Running)
{
// If we got here, the task is currently running. Notify someone
return;
}
// If we're here, the task isn't running.
}
}
Обратите внимание, что это не касается ситуаций, когда ваша задача может находиться в состоянии Faulted
или Canceled
, которые вы также можете захотеть обработать.
person
Yuval Itzchakov
schedule
11.03.2015