有没有办法在CPU运行时更新GUI或使用GUI?

时间:2014-05-26 07:05:45

标签: vb.net multithreading winforms user-interface asynchronous

我的程序的GUI在程序运行时冻结。我创建了一个批量导入,可以通过被调用的Web服务将X-000数据行发送到数据库中。代码已经很大了,我无法为多线程目的重写它。

我不知道该怎么做。有什么建议?如果需要,我会展示一些代码,但目前我还不知道要展示什么。

1 个答案:

答案 0 :(得分:6)

首先,应该重写它以避免在UI线程上同步执行此操作。如果你在UI线程上做了很多工作,只需冻结UI线程。这里有几个选项:

  • 如果您的Web服务代理支持异步调用,并且您正在使用VB 11,则可以使用Async / Await以异步方式从UI线程异步调用Web服务,并且控件将返回<当调用完成时,em>返回到异步方法中同一点的UI线程。让你的头部不同步需要一点时间,但如果可能的话,这可能是最好的选择。

  • 您可以使用任务并行库在不同的线程上进行调用,但是您需要仔细考虑该线程将如何与您的UI线程进行交互。

  • 您可以使用BackgroundWorker在另一个线程上运行某些代码,但在UI线程上报告进度和完成情况

  • 您可以在每次网络服务调用之间潜在地调用Application.DoEvents,让UI处理事件。 这很危险 - 它可能导致重入代码,因此锁定的行为不会像您期望的那样,以及类似的难以诊断的错误。如果一切都失败了,这应该是你的最后一个选择。