2010-07-21 57 views
1

作为新用户界面的使用线程等,我能问的是以下简单的设计似乎没问题。请参阅来图image at link here这是线程/后台工作者设计的C#WPF应用程序好吗?

特别是:

一)使用的BackgroundWorker的& BackgroundWorker的ProgressChanged有一个单独的线程的聚合工作。所以我需要一个自定义类/类型,它拥有我需要从聚合器线程传回我假设的UI线程的所有数据。

b)在聚合器中创建一个单独的线程,以确保SharpPCap/WinPCap回调方法位于不同的线程中。所以这个Capture Manager线程将数据包结果写入共享缓冲区。我在这里假设如果代码可以看到它们都可以访问它的缓冲区变量,而不管它们在哪个线程中运行?

感谢

+0

.NET 4是一个选项吗? – 2010-07-21 01:09:41

+0

是的,这是一个选项 – Greg 2010-07-21 01:25:10

回答

1

我有几个建议:

  • 我不会建议使用一个BackgroundWorker和ProgressChanged这一点。鉴于你想每1秒钟“轮询和聚合”,我建议只使用一个计时器(可能是一个DispatcherTimer)。如果您在单独的线程中运行(如果需要,也可以使用基于UI线程的计时器),您可以使用Dispatcher.BeginInvoke将调用重新编组回UI线程。

  • 我建议使用ConcurrentQueue<T>来保存你的分组数据,而不是一个列表。这会阻止您在列表中锁定。如果您必须坚持版本的.NET < 4,您可以使用List<T>,但您需要同步对它的访问(锁定某个对象以保护列表中的读/写操作)。只要线程安全或正确同步,两个线程都可以使用相同的集合。

  • +0

    Tks。 Re 1)聚合器是否需要知道UI?如果我想将它重用于其他用户界面,您会在这里推荐什么?某种事件方法? – Greg 2010-07-21 01:29:13

    +0

    我同意大部分里德的评论,除了我会建议使用'System.Timers.Timer'进行轮询,并使用调度到TaskScheduler.FromCurrentSynchronizationContext的Task来将调用封送回UI线程。这具有非WPF特有的优点。 – 2010-07-21 01:30:26

    +0

    我仍然很看到Dispatcher的BackgroundWorker优势吗?在我的情况下,主要原因是为什么我应该使用它在BackgroundWorker上运行,作为将更新恢复到UI层的机制? – Greg 2010-07-21 02:10:38

    相关问题