【发布时间】:2014-04-07 14:38:35
【问题描述】:
我正在尝试实现以下要求(C# 4.0);
- 一个提交上传请求的“生产者”(在 UI 线程上 - 由用户操作驱动)
-
ListView控件,数据绑定到待处理上传请求的集合 - 处理请求 (FIFO) 并在项目状态更新或请求已完成时保持 UI 最新的消费者。
到目前为止,我还没有弄清楚如何在不使用两个集合的情况下完成上述操作,如下所示;
public void AddUploadRequest(UploadRequest uploadRequest)
{
this.UploadRequests.Add(uploadRequest);
this.uploadRequestsBlocking.Add(uploadRequest);
}
...其中UploadRequests 是ObservableCollection<UploadRequest>,uploadRequestsBlocking 是BlockingCollection<UploadRequest>
完整的代码可以在这里找到; http://pastebin.com/620EqaY5(忽略 Dispatcher 的总注入 - 目前只是原型代码)
我通知我的 UI 更新如下;
this.dispatcher.Invoke(() => this.UploadRequests.Remove(uploadRequest));
有没有更好的方法来实现这个功能?或者,更重要的是,这种方法有什么严重的缺陷吗?
我正在考虑的一个可能的扩展是拥有多个消费者,通过使用Parallel.ForEach 而不是GetConsumingPartitioner(基于this 示例)。目前的方法是否会使这不合适?它确实工作正常,但我不能 100% 确信我在此过程中没有在某个地方犯下一些主要的线程错误。
【问题讨论】:
-
你使用的是 C# 5.0 吗?
-
不...我正在使用 C#4.0 - 我已更新问题以反映这一点。
标签: wpf c#-4.0 task-parallel-library