2013-10-07 93 views
2

我的情景:线程池,多线程,异步等。我应该使用什么?

  • 我有一个人进入项目ID列表到应用程序。
  • 上的Web服务的操作是对每个项目
  • 每个操作完成后一个DataGridView绑定到类和更新一些的BindingList /的ObservableCollection的运行
  • 可能还有一个身份标签,通知用户有多少项目已经完成。
  • 输入列表真的可以是任意大小的,但可能会在500左右

封顶我应该采用什么解决办法吗?线程池?根据需要创建/销毁线程?我编写了大部分代码,但需要搜索/更新才能在UI线程上运行。哪里是开始的好地方?

编辑:我必须使用.NET 3.5和不能使用的东西像异步/ AWAIT :(

回答

3

一般情况下,这听起来像是基于async/await关键字很可能是最好的选择,原因有两个语言:

  • 上的Web服务的操作是对每个项目的运行

鉴于这是一个Web服务调用,它将自然是IO绑定和异步的。使用TPL或其他例程(无需注意)可能会降低整体吞吐量。一般来说,如果你从一开始就以这种方式对待它们,你希望这些操作保持异步,并且能够扩展最佳效果。每个操作完成后

  • 一个DataGridView绑定到类和更新一些的BindingList /的ObservableCollection
  • 也有可能是一个状态标签通知许多项目已完成怎样的用户。

既然你要绑定UI控件的效果,地图async/await支持回调到调用同步上下文将简化添加结果到您的收藏。这将保持代码在最终状态下非常简单。

请注意,您可能希望存储由异步操作返回的Task<T>,然后等待返回的值(不只是直接等待消息调用)。这将允许您同时向服务发出多个请求。例如,你的代码可能会看起来像(*无异常处理等):

// Start each operation, and store in a list 

var asyncOperations = ids.Select(id => FetchDataFromWebServiceAsync(id)).ToList(); 

while (asyncOperations.Any()) 
{ 
    // When one operation completes, remove it from the list of ops running 
    var completed = await Task.WhenAny(asyncOperations); 
    asyncOperations.Remove(completed); 

    // Grab the result and use 
    YourResultType finished = completed.Result; 
    // Add to UI, update progress, etc... 
} 
+0

+1,这将是新的'async'功能 –

+0

的使用性能优异不幸的是我的约束是.NET 3.5。抱歉。我应该把它放在OP中。 – sk099

+0

@StephenKnoth使用异步调用仍然是最好的,但这将是一个很大的工作。 –