【问题标题】:Using threads in an MVC desktop application在 MVC 桌面应用程序中使用线程
【发布时间】:2014-05-26 02:24:06
【问题描述】:

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

我是这样实现 MVC 的:

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

  • Controller -> 从这些事件中接收一些信息并通过 它通过调用适当的方法来建模,就像这样 Program.model.methodX(数据)

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

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

提前谢谢大家。

【问题讨论】:

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


    【解决方案1】:

    我觉得你有几个问题,但我会尽力解决:

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

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

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

    【讨论】:

    • 我将把它标记为答案,因为它引导我解决了问题,我最终使用 ParameterizedThreadStart 传入一个带有我想要的参数的对象,然后在线程内调用事件,而不是确定这是否是最好的方法,但一切正常,非常感谢您的帮助和时间。
    猜你喜欢
    • 2012-03-09
    • 2011-09-14
    • 2019-07-06
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多