有没有一种有效的方法来使用System.Threading.Tasks与WCF服务代理?

时间:2010-09-13 02:51:27

标签: c# .net wcf task-parallel-library

在阅读recent MSDN Magazine article about the Task scheduler后,我希望(实际上非​​常兴奋)使用它将有利于我使用WCF生成的代理。

我希望得到以下一些好处:

  • 1)能够中止正在运行的WCF操作(我不希望这会停止服务器上的操作 - 我只是希望能够发出信号'我不知道想要这个任务的结果'。这在UI中尤其常见,有人从网格中反复选择触发服务调用的项目。)
  • 2)能够在创建任务之外的某个时刻启动任务 - 我不确定我是否真的需要这个,我只是认为它可能是很高兴生成一个任务,而不是立即运行它。毕竟我认为这是完成任务的重点。
  • 3)可绑定属性 - 所以我可以将我的WCF UI绑定到IsCompleted,让Task类从我的UI中抽象出操作的内部。
  • 4)能够抽象出操作的运行 - 嘲笑,等等等等,未来的重构等。

但是 - 我似乎没有获得任何这些好处。

  • 1)任务中没有中止功能 - 这让我觉得很奇怪。
  • 2)我可以使用Task.Factory.FromAsync<>进行的唯一重载如下所示。这立即开始执行webservice操作(如Fiddler所示),并且不允许我稍后开始调用。
  • 3)任务没有实现INotifyPropertyChanged所以我无法将其绑定到UI。
  • 4)鉴于其他3项好处没有发生,这个人在水中已经死了: - (

Sooo ....我只是在浪费时间试图让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 个答案:

答案 0 :(得分:1)

作为Microsoft计划下一版C#的新Async功能的一部分,他们发布了CTP here,它与VS 2010 SP1兼容。

前段时间,我写了一篇关于其中一个与CTP捆绑在一起的样本的小博客文章,关于TaskWsdlImportExtension