【问题标题】:VB.NET Using BackgroundWorker to prevent UI freeze - alternatives?VB.NET 使用 BackgroundWorker 防止 UI 冻结 - 替代方案?
【发布时间】:2013-06-27 05:42:48
【问题描述】:

我刚刚开始了一个类似的帖子,但我觉得这是一个单独的问题,所以就这样吧!

我正在使用 BackgroundWorker 来防止我的 UI 在执行许多文件操作时锁定。虽然这解决了问题,但它创建了另一个,因为调用 BackgroundWorker 的函数需要根据 BackgroundWorker 的结果返回真/假。

显然,有一些方法可以解决这个问题 - 使用循环来检查工作人员是否忙,但这似乎是一种特别笨拙的做事方式。我对此做了一些进一步的阅读,很多人说如果我需要等到 BackgroundWorker 完成,我一开始就违背了使用它的目的。

我在这里有什么选择?是否有一种“正确”的方式在函数中使用 BackgroundWorker 并且仍然让它根据 BackgroundWorker 正在执行的工作的结果报告返回值,或者是否有一种更简单的方法可以让我的 UI 在其他事情发生时保持响应开吗?

【问题讨论】:

    标签: vb.net user-interface backgroundworker freeze


    【解决方案1】:

    在启动 BackgroundWorker 时设置 BackgroundWorker.WorkerReportsProgress = True

    在您的DoWork 方法中调用BackgroundWorker.ReportProgress,并在您的主线程中处理BackgroundWorker.ProgressChanged 事件。

    【讨论】:

    • 我已经做好了,但我的代码看起来像这样:code Public Function DoStuff() as Boolean BWorker.RunWorkerAsync() '如果 BWorker 工作则返回 true,如果有则返回 false破坏了 End Function code 所以我需要 DoStuff 函数根据 BackgroundWorker 的结果返回 true 或 false。
    • 为此,只需在主线程中处理BackgroundWorker.RunWorkerCompleted 并检查e.Cancelled 的值。要设置该值,如果长进程失败,只需在DoWork 中使用e.Cancel = True
    • 否则你可以试试VB2012的新Async/Await特性msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多