Существует ли эффективный способ использования System.Threading.Tasks с прокси-серверами WCF? - PullRequest
4 голосов
/ 13 сентября 2010

После прочтения недавней статьи в журнале 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
}); 

1 Ответ

1 голос
/ 28 апреля 2011

Как часть новых возможностей Async, которые Microsoft планирует выпустить в следующей версии C #, они выпустили CTP здесь , он совместим с VS 2010 SP1.

A поканазад, я написал небольшое сообщение в блоге об одном из примеров, который связан с CTP, о TaskWsdlImportExtension .

...