0

我想知道如何以不冻结 GUI 的方式运行以下循环,因为循环可能需要几分钟才能完成。谢谢你。

For i = 0 To imageCount
         'code
Next
4

2 回答 2

3

简短的回答是你在另一个线程上运行循环。长的答案是一整本书和几个学期的大学,因为它需要资源访问冲突以及解决它们的各种方法,例如锁定和排队。

由于您似乎在使用 VB.NET,我建议您使用最新版本的 .NET 框架并利用 Async 和 Await,您可以从 MSDN 中了解这些信息。

这些关键字实现了一个非常复杂的罐头解决方案,可以让您在无知背后的噩梦中实现您的目标:)


为什么有经验的并行编码人员会为 async/await 烦恼

async/await 的突出特点是

  • 根据需要自动临时编组回 UI 线程
  • 异常处理程序的范围(try/catch/finally)可以跨越设置和回调代码
  • 你在 UI 线程上编写了带有阻塞调用的概念上的线性代码,但是因为你使用“await”声明了阻塞的调用,编译器将你的代码重写为状态机,使前面的观点成立

带有阻塞调用的线性代码易于编写和阅读。因此,从维护的角度来看,它要好得多。但它提供了一个糟糕的用户体验。异步/等待意味着你可以同时拥有它。

这一切都建立在 TPL 之上;在非常真实的意义上,它只不过是编译器支持的 TPL 设计模式,这就是为什么标记为 async 的方法需要返回一个Task<>. 有很多值得喜欢的地方,而且我没有看到任何技术上的缺点。

我唯一担心的是它太好了,所以整整一代人都不知道他们站在谁的肩膀上的巨人有多高,就像大多数现代程序员对调用堆栈中堆栈帧的机制只有模糊的认识(背后的魔力)局部变量)。

于 2013-04-16T00:13:41.637 回答
2

您可以在单独的线程上运行循环。BackgroundWorker在此处阅读有关使用http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

于 2013-04-16T00:18:06.253 回答