在UI中使用线程等新手,请问以下简单设计似乎没问题。请参阅图image at link here
特别是:
a)使用backgroundworker& backgroundworker ProgressChanged让聚合器在单独的线程上工作。所以我需要一个自定义类/类型,其中包含我需要从聚合器线程传递回我假设的UI线程的所有数据。
b)在聚合器中创建一个单独的线程,以确保SharpPCap / WinPCap回调方法位于不同的线程中。因此,此Capture Manager线程将数据包结果写入共享缓冲区。我在这里假设,如果代码可以看到缓冲变量,他们都可以访问它,无论它们在哪个线程中运行?
感谢
答案 0 :(得分:1)
我有几点建议:
我不建议使用BackgroundWorker和ProgressChanged。鉴于您希望每1秒“轮询和聚合”,我建议您只使用一个Timer(可能是DispatcherTimer)。您可以使用Dispatcher.BeginInvoke
将调用封送回UI线程,如果您在单独的线程中运行(如果需要,还可以使用基于UI线程的计时器)。
我建议使用ConcurrentQueue<T>
来保存您的数据包数据,而不是列表。这样可以防止您需要锁定列表。如果必须坚持使用.NET&lt; 4的版本,则可以使用List<T>
,但是您需要同步对它的访问(锁定某个对象以保护列表中的读/写操作)。只要线程安全或正确同步,两个线程都可以使用相同的集合。