Vb.net 带线程的Windows窗体项目

Vb.net 带线程的Windows窗体项目,vb.net,multithreading,Vb.net,Multithreading,我读过很多关于Windows窗体项目不支持MTA的资料。我明白了。不过,我也读过关于后台工作程序、异步/等待和BeginInvoke与此类解决方案的使用。这只是几个例子。甚至使用MSMQ。我回顾的一些示例可以追溯到VB6 我需要用代码扩充一个Windows窗体项目,以便通过API调用与供应商服务交互,从而从异步功能中获益。今年是2014年,最好的方法是什么?我使用VB网络和VS2010进行开发 理想情况下,我希望创建一个具有与供应商交互逻辑的类库,并将结果返回到我的Windows窗体项目。可以这

我读过很多关于Windows窗体项目不支持MTA的资料。我明白了。不过,我也读过关于后台工作程序、异步/等待和BeginInvoke与此类解决方案的使用。这只是几个例子。甚至使用MSMQ。我回顾的一些示例可以追溯到VB6

我需要用代码扩充一个Windows窗体项目,以便通过API调用与供应商服务交互,从而从异步功能中获益。今年是2014年,最好的方法是什么?我使用VB网络和VS2010进行开发


理想情况下,我希望创建一个具有与供应商交互逻辑的类库,并将结果返回到我的Windows窗体项目。可以这样做吗?

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

这一点的重要作用在于,它意味着应用程序中的主线程负责处理与用户界面有关的所有事情。您可以启动任意数量的线程,但只要这些线程中的任何内容需要显示在用户界面中,它们就必须使用
Invoke
方法在主线程中进行更新

框架中已经有异步方法,例如
System.IO.FileStream
类中的
BeginRead
BeginWrite
方法。您可以查看这些,以获得关于如何在框架中使用异步方法的一些提示


如果API是同步的,则只需启动一个执行API调用的新线程,然后在调用完成后执行回调方法,即可创建异步方法。由于正是该线程在等待响应,因此该调用不会占用主线程。

谢谢@Guffa的回复。这确实有助于澄清一些谜团。你有一些代码来说明你的偏好吗?嗯。。。什么偏好?还有,使用wait操作符怎么样。MSFT最近似乎不喜欢这种异步处理方法吗?@Ebassador:
await
操作符用于返回
任务
对象的异步方法。如果你的API能做到这一点,这将是一个自然的选择,但它已经是异步的了
async
/
await
需要VS2012。@斯蒂芬:不幸的是,VS2012目前不是一个选项。