После прочтения недавней статьи в журнале MSDN Magazine о планировщике задач я надеялся (и на самом деле очень рад), что его использование принесет пользу моему использованию созданных WCF прокси.
Я надеялсячтобы получить некоторые из следующих преимуществ:
- 1) Возможность прервать текущую операцию WCF (я не ожидаю, что это остановит операцию на сервере - я быточно так же, как возможность сигнализировать, что «я не хочу результата для этой задачи». Это особенно часто встречается в пользовательском интерфейсе, где кто-то неоднократно выбирает элементы в сетке, которые вызывают вызовы службы.)
- 2) Возможность запустить задачу в какой-то момент, отличный от того, когда она была создана - я не уверен, что мне действительно нужно , я просто подумал, что было бы неплохо сгенерировать задачу, а не сразузапустить его.В конце концов, я думал, что в этом весь смысл задач.
- 3) Связываемые свойства - так что я могу связать свой пользовательский интерфейс WCF с
IsCompleted
и позволить классу Task абстрагировать внутреннюю часть операциииз моего пользовательского интерфейса. - 4) Возможность абстрагироваться от выполнения операции - издевательства, бла-бла-бла, будущий рефакторинг и т. д.
Однако - яКажется, я не получаю НИКАКИХ из этих преимуществ.
- 1) В Task нет функции прерывания - что кажется мне действительно странным.
- 2) Единственная перегрузка, которую яможет работать с
Task.Factory.FromAsync<>
, как показано ниже.Это немедленно начинает выполнение операции веб-сервиса (как видно из Fiddler) и не позволяет мне начать вызов позже. - 3) Задача не реализует
INotifyPropertyChanged
, поэтому я не могу связать ее сUI. - 4) Этот вид мёртв в воде, учитывая, что остальные 3 преимущества не происходят: - (
Оооо .... Я просто трачу впустуюпытаться заставить сгенерированные WCF прокси работать с Задачами - или я что-то упустил.
// WCF client
var client = new ShoppingCartClient();
// create task
var t = Task.Factory.FromAsync<GetOrderDetailsMsgOut>(
client.BeginGetOrderDetails(new GetOrderDetailsMsgIn()
{
OrderId = 12345
}, null, null),
client.EndGetOrderDetails);
t.ContinueWith(x =>
{
var order = x.Result.Order;
// do something with order
});