Gdzie zdefiniować callback dla asynchronicznej metody opartej na zadaniach

Podążając zato pytanie , próbuję zaimplementować metodę asynchroniczną przy użyciu TPL i staram się przestrzegać wytycznych TAP.

Chcę, aby moja metoda asynchroniczna wykonała callback po jej zakończeniu. Mogę to zrobić na trzy sposoby.

1) oddzwanianie ręcznie w moim delegacie zadań

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

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

2) Przypisz callback do zadania w delegacie zadań

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

3) przypisanie callback do zadania w rozmówcy

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

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

Moje przeczucie jest takie, że 3 jest bardziej poprawne, ponieważ oddziela callback od metody, i oznacza, że kod klienta może zarządzać zadaniem w dowolny sposób, jak uzna to za stosowne (za pomocą wywołań zwrotnych, ankiety itp.), który wydaje się być to, co zadania są o. Co się jednak stanie, jeśli DoWorkAsync () zakończy swoją pracę, zanim kod klienta podłączy się do połączenia zwrotnego?

Czy istnieje ogólnie akceptowany sposób, aby to zrobić, czy jest to zbyt nowe?

Czy jest jakaś korzyść z robienia 2) nad 1)?

Author: Community, 2011-11-23

1 answers

Ogólnie przyjętym sposobem jest 3.

Użytkownicy TPL ogólnie wiedzą, że mogą kontynuować zadanie za pomocą ContinueWith. 1 i 2 zapewniają tę samą funkcjonalność, ale z niestandardowym interfejsem; użytkownik musi dowiedzieć się, co oznacza parametr delegate i co przekazać, np. jeśli nie chce kontynuować-wszystko to, podczas gdy metoda nadal zwraca zadanie, które może być kontynuowane w standardowy sposób.

 35
Author: dtb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-23 15:22:07