После этого вопроса я пытаюсь реализовать асинхронный метод с использованием 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)?