Я работаю на простом сервере, который предоставляет веб-сервисы клиентам. Некоторые из запросов могут занять много времени и логически разбиты на несколько этапов. Для таких запросов требуется сообщать о ходе выполнения. Кроме того, новый запрос может быть инициирован до завершения предыдущего, и требуется, чтобы оба выполнялись одновременно (за исключением некоторых системных ограничений).
Я думал о том, чтобы сервер возвратил TaskId своим клиентам, и чтобы клиенты отслеживали ход запросов с помощью TaskId. Я думаю, что это хороший подход, и я остаюсь с вопросом о том, как управляются задачи.
Никогда не используя TPL, я думал, что это будет хорошим способом решения этой проблемы. Действительно, это позволяет мне запускать несколько задач одновременно без необходимости вручную управлять потоками. Я даже относительно легко могу создавать многошаговые задачи, используя ContinueWith.
Хотя я не могу придумать хороший способ отслеживать ход выполнения задачи. Я понимаю, что когда мои запросы состоят из одного «шага», тогда этот шаг должен сообщать о своем состоянии совместно. Это то, что я предпочел бы избежать в этой точке. Однако, когда запрос состоит из нескольких этапов, я хотел бы знать, какой этап выполняется в настоящее время, и соответственно сообщить о ходе выполнения. Единственный способ, которым я мог придумать, является чрезвычайно утомительным:
Task<int> firstTask = new Task( () => { DoFirstStep(); return 3.14; } );
firstTask.
ContinueWith<int>( task => { UpdateProgress("50%"); return task.Result; } ).
ContinueWith<string>( task => { DoSecondStep(task.Result); return "blah"; }.
ContinueWith<string>( task => { UpdateProgress("100%"); return task.Result; } ).
И даже это не идеально, так как я хотел бы, чтобы Задача сохраняла свой собственный прогресс, вместо того, чтобы UpdateProgress обновлял какое-то известное местоположение. Кроме того, у него есть очевидный недостаток, заключающийся в необходимости менять множество мест при добавлении нового шага (поскольку теперь прогресс составляет 33%, 66%, 100% вместо 50%, 100%).
У кого-нибудь есть хорошее решение?
Спасибо!