C#WPF应用程序的线程/后台工作程序设计可以吗?
作为在UI中使用线程等的新手,我可以问一下,下面的简单设计看起来还可以吗。参考图表 特别是: a) backgroundworker和backgroundworker进程的使用已更改为使聚合器在单独的线程上工作。因此,我需要一个自定义类/类型,该类/类型包含从聚合器线程传回UI线程所需的所有数据 b) 在聚合器中创建一个单独的线程,以确保SharpPCap/WinPCap回调方法位于不同的线程中。因此,此捕获管理器线程将数据包结果写入共享缓冲区。我在这里假设,如果代码可以看到缓冲区变量,那么无论它们运行在哪个线程中,它们都可以访问它C#WPF应用程序的线程/后台工作程序设计可以吗?,c#,.net,wpf,multithreading,backgroundworker,C#,.net,Wpf,Multithreading,Backgroundworker,作为在UI中使用线程等的新手,我可以问一下,下面的简单设计看起来还可以吗。参考图表 特别是: a) backgroundworker和backgroundworker进程的使用已更改为使聚合器在单独的线程上工作。因此,我需要一个自定义类/类型,该类/类型包含从聚合器线程传回UI线程所需的所有数据 b) 在聚合器中创建一个单独的线程,以确保SharpPCap/WinPCap回调方法位于不同的线程中。因此,此捕获管理器线程将数据包结果写入共享缓冲区。我在这里假设,如果代码可以看到缓冲区变量,那么无论
谢谢我有几点建议:
Dispatcher.BeginInvoke
将调用封送回UI线程(如果需要,还可以使用基于UI线程的计时器)Dispatcher.BeginInvoke
将调用封送回UI线程(如果需要,还可以使用基于UI线程的计时器)系统.Timers.Timer
进行轮询,并使用任务调度程序.FromCurrentSynchronizationContext
调度的任务将调用封送回UI线程。这具有非WPF特定的优势。我仍然很清楚Dispatcher相对于BackgroundWorker的优势?在我的例子中,什么是我应该在BackgroundWorker上运行它作为一种将更新返回到UI层的机制的主要原因?@Greg:在BW中使用ReportProgress实际上有点不符合预期目的。这会导致您的代码不清楚,并且比只重新编写代码更难编写。Stephen关于使用TaskScheduler的建议是非常好的,但是您需要确保将在UI上下文中创建的调度器预先传递给后台线程。(我本来打算写这篇文章,但需要一点额外的解释,所以我把它删掉了…@Reed-谢谢,但还是有点困惑-你能从我贴的图表/图片中澄清一下吗,您的意思是,在我的图表中,与聚合器线程和UI线程相关的TaskScheduler/后台线程等的启动?顺便说一句,我正在考虑使用quartz.net来确保计时间隔不会漂移(不确定这是否会影响您的建议)。Tks。Re 1)聚合器是否需要了解UI?如果我想在其他UI中重用它,您会推荐什么?某种程度上是一种事件方法?我同意里德的大多数评论,只是我建议使用系统.Timers.Timer
进行轮询,并使用任务调度程序.FromCurrentSynchronizationContext
调度的任务将调用封送回UI线程。这具有非WPF特定的优势。我仍然很清楚Dispatcher相对于BackgroundWorker的优势?在我的例子中,什么是我应该在BackgroundWorker上运行它作为一种将更新返回到UI层的机制的主要原因?@Greg:在BW中使用ReportProgress实际上有点不符合预期目的。这会导致您的代码不清楚,并且比只重新编写代码更难编写。Stephen关于使用TaskScheduler的建议是非常好的,但是您需要确保将在UI上下文中创建的调度器预先传递给后台线程。(我本来打算写这篇文章,但需要一点额外的解释,所以我把它删掉了…@Reed-谢谢,但还是有点困惑-你能从我贴的图表/图片中澄清一下吗,您的意思是,在我的图表中,与聚合器线程和UI线程相关的TaskScheduler/后台线程等的启动?顺便说一句,我正在考虑使用quartz.net来确保计时间隔不会漂移(不确定这是否会影响您的建议)。