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

时间:2014-05-26 02:24:06

标签: c# multithreading winforms model-view-controller

我正在使用MVC开发一个C#桌面应用程序(Windows窗体),我想使用线程,因为我认为它将为我提供一个与最终用户的视图更流畅的交互,我会尽力解释我最好的东西我想。

我实现了这样的MVC:

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

  • 控制器 - >从这些事件和通行证中收到一些信息 通过调用适当的方法进行建模,就像这样 Program.model.methodX(数据)

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

该模型实际上做的是与PLC通信以从某些寄存器获取一些数据,而它这样做的视图被冻结等待回复..我试图在模型中实现线程,因为我觉得它是合适的对于这个问题,问题是我需要为线程传递一些信息(寄存器数量等)这是一个问题,因为线程需要一个返回void并且没有参数的方法(ThreadStart),并且最后发送数据通过触发事件是一个问题,因为它需要一个对象引用,如果它是一个非静态的方法,字段或属性等。有什么方法可以实现这一点,还是我认为都错了?

提前谢谢大家。

1 个答案:

答案 0 :(得分:1)

我觉得你有几个问题,但我会尝试解决它们:

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

  2. 关于传入数据和获取数据,您应该考虑使用TaskFactory,特别是StartNew方法来创建新的Task。您可以传递lambda,带参数的方法和返回结果的函数,然后您可以使用task对象等待并检索结果。有关线程的更多信息,包括使用TaskFactory的一些见解,请查看Joseph Albahari在threading上的此链接。这是一个很好的资源。

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