【问题标题】:Windows Forms Project with Threading带有线程的 Windows 窗体项目
【发布时间】:2014-04-01 18:03:33
【问题描述】:

我已经阅读了很多关于不支持 MTA 的 Windows 窗体项目的材料。我得到它。但是,我还阅读了有关后台工作程序、异步/等待和 BeginInvoke 与此类解决方案一起使用的信息。 Thisthis 只是几个例子。 Here's one 甚至使用 MSMQ。我回顾的一些示例可以追溯到 VB6 天。

我需要使用代码来扩充 Windows 窗体项目,以便通过 API 调用与供应商服务进行交互,这可能会受益于异步功能。这是 2014 年,解决这个问题的最佳方法是什么?我使用 VB NET 并使用 VS 2010 进行开发。

理想情况下,我想创建一个类库,其中包含与供应商交互的逻辑并将结果返回到我的 Windows 窗体项目。可以吗?

【问题讨论】:

  • 可以升级VS吗? async/await 需要VS2012。
  • @Stephen:不幸的是,VS2012 目前不是一个选项。

标签: vb.net multithreading


【解决方案1】:

不支持 MTA 的事实并不意味着您不能使用多个线程。 MTA 模型只是使用多线程的一种方式,但由于难以为该模型实现对象,Windows 窗体改用 STA 模型。

这样做的重要作用只是意味着应用程序中的主线程负责处理与用户界面有关的所有事情。您可以根据需要/需要启动任意数量的线程,但是每当需要在用户界面中显示这些线程中的任何内容时,它们都必须使用 Invoke 方法让更新在主线程中完成。

框架中已经存在异步方法,例如System.IO.FileStream类中的BeginReadBeginWrite方法。您可以查看那些关于如何在框架中使用异步方法的一些提示。

如果 API 是同步的,您只需启动一个执行 API 调用的新线程,然后在完成后执行回调方法即可创建异步方法。因为是那个线程在等待响应,所以调用不占用主线程。

【讨论】:

  • 感谢@Guffa 的回复。这确实有助于解开一些谜团。你有一些代码来说明你的偏好吗?
  • 嗯...什么偏好?
  • 另外,使用 await 操作符怎么样。 MSFT 最近似乎不赞成这种异步处理方法吗?
  • @Ebassador:await 运算符与返回 Task 对象的异步方法一起使用。如果您的 API 这样做,那将是一个自然的选择,但它已经是异步的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 2012-06-15
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
相关资源
最近更新 更多