【问题标题】:Is this thread/background worker design for a C# WPF application OK?这个 C# WPF 应用程序的线程/后台工作人员设计可以吗?
【发布时间】:2010-07-21 00:57:46
【问题描述】:

刚开始在 UI 中使用线程等,请问以下简单的设计是否可行。参考示意图image at link here

特别是:

a) 使用 backgroundworker 和 backgroundworker ProgressChanged 让聚合器在单独的线程上工作。所以我需要一个自定义类/类型,它包含我需要从聚合器线程传递回我假设的 UI 线程的所有数据。

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

谢谢

【问题讨论】:

    标签: c# .net wpf multithreading backgroundworker


    【解决方案1】:

    我有几个建议:

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

    2. 我建议使用ConcurrentQueue&lt;T&gt; 来保存您的数据包数据,而不是列表。这将防止您需要锁定您的列表。如果您必须坚持使用 .NET List<T>,但您需要同步对它的访问(锁定某些对象以保护列表中的读/写操作)。两个线程都可以使用同一个集合,前提是它是线程安全的或正确同步的。

    【讨论】:

    • Tks。重新 1) 聚合器是否需要 UI 知识?如果我想将它重用于其他 UI,你会在这里推荐什么?某种事件方法?
    • 我同意 Reed 的大多数 cmets,但我建议使用 System.Timers.Timer 进行轮询,并使用预定为 TaskScheduler.FromCurrentSynchronizationContextTask 将调用编组回 UI 线程.这具有非 WPF 特定的优点。
    • 我还是很看出我们 Dispatcher 比 BackgroundWorker 的优势吗?在我的案例中,为什么我应该在 BackgroundWorker 上运行它作为将更新返回 UI 层的机制的主要原因是什么?
    • @Greg:在 BW 中使用 ReportProgress 确实有点不符合预期目的。这会导致您的代码不清楚,并且比重新编写代码更难编写。 Stephen 关于使用 TaskScheduler 的建议是一个非常好的建议——但您需要确保将您的后台线程传递给预先在 UI 上下文中创建的调度程序。 (本来是想写的,不过需要多解释一下,所以省略了……)
    • @Reed - 谢谢,但仍然有点困惑 - 你能否根据我发布的图表/图像澄清一下,你的意思是与聚合器相关的 TaskScheduler/后台线程等我的图表上有线程和 UI 线程?顺便说一句,我正在考虑使用quartz.net 来确保时间间隔不会漂移(不确定这是否会影响您的建议)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    相关资源
    最近更新 更多