繁体   English   中英

在MVC桌面应用程序中使用线程

[英]Using threads in an MVC desktop application

我正在使用MVC开发C#桌面应用程序(Windows窗体),并且希望使用线程,因为我认为它将为最终用户提供更流畅的视图交互,我将尽我所能解释。

我这样实现了MVC:

  • View->有几个触发事件的控件,这些事件由控制器订阅

  • 控制器->从这些事件中接收一些信息,并通过调用适当的方法将其传递给模型,例如Program.model.methodX(data)

  • 模型->处理信息,并通过触发视图订阅的事件将数据发送到视图,以便它可以更新自身

该模型实际执行的操作是与PLC进行通信,以从某些寄存器中获取一些数据,而在执行此操作时,视图将冻结以等待答复。.我尝试在模型中实现线程,因为我认为它是执行此操作的适当位置,问题是我需要为线程传递一些信息(寄存器数等),这是一个问题,因为线程需要一个返回void并且没有参数的方法(ThreadStart),最后将数据发送到通过触发一个事件来查看问题,因为如果它是非静态方法,字段或属性等,因为它需要对象引用。是否有任何方法可以实现此目的,或者我认为这是错误的吗?

谢谢大家。

我觉得您那里有几个问题,但我会尝试解决:

  1. 您可以将参数传递给线程,但是需要使用ParameterizedThreadStart来允许传递对象。

  2. 关于传递数据和取回数据,您应该考虑使用TaskFactory ,尤其是StartNew方法,它将创建一个新Task 您可以传递lambda,具有参数的方法以及将返回结果的函数,然后可以使用任务对象等待并检索结果。 有关线程的更多信息,包括对使用TaskFactory一些了解, TaskFactory查看Joseph Albahari的有关线程的链接。 这是一种极好的资源。

在一般意义上说,有许多技术可用于将数据进出线程。 您可以传入this参数,然后可以访问其所有成员,只需记住您正在处理多个线程,因此在读取/写入数据时要格外小心。 如果存在共享数据,则需要通过某种形式的锁定来保护它。 如果您不必在线程运行时共享数据,我可能会创建一个类来保存需要将其传递给线程的数据,并对结果进行相同的处理。 然后,您可以只使用TaskFactory.StartNew来启动任务并传递数据,并使用任务的结果取回数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM