【问题标题】:Library for executing long-running actions in .NET/Windows Forms?用于在 .NET/Windows 窗体中执行长时间运行的操作的库?
【发布时间】:2011-10-07 14:27:03
【问题描述】:

是否有库/框架可以在 .NET 中执行长时间运行的操作?寻找这样的东西:

private void button1_Click(...)
{
  LongActionRunner.Execute((ref int total, ref int done) => {
    // i know it's not thread-safe
    total = 100;
    for(var i = 0; i <= 100; ++i) {
      done = i;
      Thread.Sleep(100); // slow
    }
  });
}

Execute() 被调用时,我需要显示一个带有进度条的窗口。如果我的操作抛出,它应该显示错误消息等。

有没有现成的解决方案?

【问题讨论】:

    标签: .net winforms multithreading concurrency


    【解决方案1】:

    您可以使用BackgroundWorker。它特别适用于您提出的场景。 有关如何使用 BackgroundWorker 实现进度条的教程,请参阅 here

    【讨论】:

    • 进度条、错误处理等呢?只是不想自己编写代码。
    • 你仍然需要添加一个进度条...但是 backgroundworker 有一个 'progressChanged' 事件,这使得进度条变得简单
    • @lok​​i2302 - 无论解决方案如何,您都必须自己编写所有代码。
    【解决方案2】:

    BackroundWorker 使用线程池线程,因此您应该只将它用于相对(最大 1 秒)的工作单元。如果您的操作需要更长的时间,您应该创建一个线程。

    我和我怀疑的许多其他人一起为商业项目编写了这个,但我不知道任何开源解决方案。我同意您需要显示一个带有进度条的对话框,如果只是为了防止用户按两次 button1 并导致重新进入。正如您所说,您还必须处理错误和取消。

    【讨论】:

    • 您能否为“最多 1 秒”声明提供引用?多年来,我一直在使用在商业项目中花费大量时间的 BackgroundWorkers,没有出现任何问题。
    • @Dour:这是之前的问题:stackoverflow.com/questions/230003/thread-vs-threadpool 使用线程池处理长时间运行的任务会混淆其线程管理算法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多