如何在不冻结GUI的情况下进行For循环?

时间:2013-04-16 00:07:46

标签: windows vb.net for-loop

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

For i = 0 To imageCount
         'code
Next

2 个答案:

答案 0 :(得分:3)

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

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

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


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

async / await的突出特点是

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

带阻塞调用的线性代码易于编写且易于阅读。从维护的角度来看,它会好得多。但它提供了一个残暴的用户体验。 Async / await意味着你可以双管齐下。

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

我唯一担心的是它的所有好,所以整整一代人都不知道他们的肩膀上的巨人有多高,正如大多数现代程序员对机制的朦胧意识一样调用堆栈中的堆栈帧(局部变量背后的魔力)。

答案 1 :(得分:2)

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

,了解BackgroundWorker的使用情况