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

For i = 0 To imageCount
         'code
Next

===============>>#1 票数:3

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

由于您似乎正在使用VB.NET,因此建议您使用最新版本的.NET框架,并利用Async和Await的优势,您可以从MSDN中了解有关信息。

这些关键字实现了一个非常复杂的罐头解决方案,使您能够对自己背后的噩梦一无所知,从而实现自己的目标:)


为什么经验丰富的并行编码员会为异步/等待而烦恼

异步/等待的突出特点是

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

具有阻塞调用的线性代码易于编写和读取。 因此,从维护角度来看,这要好得多。 但是它提供了一个残酷的用户体验。 异步/等待意味着您可以同时使用它。

所有这些都是基于TPL构建的; 实际上,这无非是TPL的编译器支持的设计模式,这就是为什么标记为async的方法需要返回Task<> 有很多事情值得我喜欢,而且我没有看到技术上的缺点。

我唯一担心的是,这一切都美好,让整整一代将不知道如何高大的巨人在其他们栖息的肩膀,就像最现代的程序员只变暗在调用堆栈栈帧的力学意识(背后的魔力局部变量)。

===============>>#2 票数:2

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

  ask by bad_wine translate from so

未解决问题?本站智能推荐: