Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WPF应用程序的线程/后台工作程序设计可以吗?_C#_.net_Wpf_Multithreading_Backgroundworker - Fatal编程技术网

C#WPF应用程序的线程/后台工作程序设计可以吗?

C#WPF应用程序的线程/后台工作程序设计可以吗?,c#,.net,wpf,multithreading,backgroundworker,C#,.net,Wpf,Multithreading,Backgroundworker,作为在UI中使用线程等的新手,我可以问一下,下面的简单设计看起来还可以吗。参考图表 特别是: a) backgroundworker和backgroundworker进程的使用已更改为使聚合器在单独的线程上工作。因此,我需要一个自定义类/类型,该类/类型包含从聚合器线程传回UI线程所需的所有数据 b) 在聚合器中创建一个单独的线程,以确保SharpPCap/WinPCap回调方法位于不同的线程中。因此,此捕获管理器线程将数据包结果写入共享缓冲区。我在这里假设,如果代码可以看到缓冲区变量,那么无论

作为在UI中使用线程等的新手,我可以问一下,下面的简单设计看起来还可以吗。参考图表

特别是:

a) backgroundworker和backgroundworker进程的使用已更改为使聚合器在单独的线程上工作。因此,我需要一个自定义类/类型,该类/类型包含从聚合器线程传回UI线程所需的所有数据

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


谢谢

我有几点建议:

  • 我不建议为此使用BackgroundWorker和ProgressChanged。考虑到您希望每1秒“轮询和聚合”,我建议只使用计时器(可能是分派器)。如果在单独的线程中运行,则可以使用
    Dispatcher.BeginInvoke
    将调用封送回UI线程(如果需要,还可以使用基于UI线程的计时器)


  • 我建议使用一个列表来保存数据包数据,而不是列表。这将防止您需要锁定列表。如果您必须坚持使用.NET版本,我有几点建议:

  • 我不建议为此使用BackgroundWorker和ProgressChanged。考虑到您希望每1秒“轮询和聚合”,我建议只使用计时器(可能是分派器)。如果在单独的线程中运行,则可以使用
    Dispatcher.BeginInvoke
    将调用封送回UI线程(如果需要,还可以使用基于UI线程的计时器)


  • 我建议使用一个列表来保存数据包数据,而不是列表。这将防止您需要锁定列表。如果您必须坚持使用.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来确保计时间隔不会漂移(不确定这是否会影响您的建议)。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来确保计时间隔不会漂移(不确定这是否会影响您的建议)。