Где определить обратный вызов для асинхронного метода на основе задач - PullRequest
43 голосов
/ 23 ноября 2011

После этого вопроса я пытаюсь реализовать асинхронный метод с использованием TPL и стараюсь следовать рекомендациям TAP.

Я хочу, чтобы мой асинхронный метод выполнил обратный вызов по завершении,Насколько я вижу, есть три способа сделать это:

1) Обратный вызов вручную в моем делегате задачи

public Task DoWorkAsync(DoWorkCompletedCallback completedCallback)
{
    return Task.Factory.StartNew(
    { 
        //do work

        //call callback manually
        completedCallback();
    });
}

2) Назначить обратный вызов для задачи в делегате задачи

public Task DoWorkAsync(DoWorkCompletedCallback completedCallback)
{
    return Task.Factory.StartNew(
    { 
        //do work
    }
    ).ContinueWith(completedCallback); //assign callback to Task
}

3) Назначить обратный вызов для задачи в вызывающей стороне

public Task DoWorkAsync()
{
    return Task.Factory.StartNew(
    { 
        //do work
    });
}

public void SomeClientCode()
{
    Task doingWork = DoWorkAsync();
    doingWork.ContinueWith(OnWorkCompleted);
}

Мне кажется, что 3 правильнее, потому что он отделяет обратный вызов от метода и означает, что клиентский код может управлятьЗадача любым способом, который он считает нужным (используя обратные вызовы, опрос и т. д.), что, по-видимому, и является задачей всех задач.Однако что произойдет, если DoWorkAsync () завершит свою работу до того, как код клиента подключит свой обратный вызов?

Есть ли общепринятый способ сделать это или он слишком новый?

какое-либо преимущество в выполнении 2) над 1)?

1 Ответ

32 голосов
/ 23 ноября 2011

Общепринятый способ - 3.

Пользователи TPL обычно знают, что они могут продолжить задачу с помощью ContinueWith. 1 и 2 предоставляют те же функциональные возможности, но с нестандартным интерфейсом; пользователь должен выяснить, что означает параметр делегата и что передать, например. если они не хотят продолжать - все это, пока метод все еще возвращает Задачу, которую можно продолжить стандартным способом.

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