Как обрабатывать несколько асинхронных методов при запуске?

Как я могу узнать, запущена ли уже асинхронная (ожидаемая) операция и ожидает ли она завершения в приложении. У меня есть две кнопки в представлении, каждая из которых привязана к двум разным асинхронным методам. Если нажата кнопка 1, асинхронный запуск запускается и ждет результата. И в то время, если кнопка2 нажата. Мне нужно показать сообщение о том, что уже запущен асинхронный метод, и остановить выполнение второго асинхронного метода. Как я могу достичь этого?


person TutuGeorge    schedule 11.03.2015    source источник
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
comment
отключение кнопки для запуска задачи кажется лучшей идеей; вы не можете нажать кнопку, которая отключена. Если вы можете, задача выполнена. - person Peter Ritchie; 11.03.2015
comment
@PeterRitchie Да, очень хорошая идея. Нуб, рассмотри это как лучшую альтернативу. - person Sriram Sakthivel; 11.03.2015
comment
Я хотел бы показать сообщение типа «Уже запущено» при нажатии второй кнопки. Если кнопка отключена, я не смогу поймать это событие. Подход, упомянутый Шрирамом, кажется прекрасным. Позвольте мне сначала попробовать это. - 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