【问题标题】:Looping until Background Thread Completes循环直到后台线程完成
【发布时间】:2015-07-06 19:04:42
【问题描述】:

我为长时间运行的任务创建了一个表单,其目的是循环一个进度条,直到线程完成。我将此表单显示为对话框,以便我的主应用程序正在等待此表单返回。

不幸的是,我的 RunWorkerCompleted 在线程实际完成其任务之前被调用。

什么是等待线程完成而不加入的有效方法?

public partial class FormProcessing : Form
{
    public ThreadStart StartTaskFunc { get; set; }

    public FormProcessing()
    {
        InitializeComponent();

        bgWorker.DoWork += bgWorker_DoWork;
        bgWorker.ProgressChanged += bgWorker_ProgressChanged;
        bgWorker.RunWorkerCompleted += bgWorker_RunWorkerCompleted;
        Shown += (s, e) =>
        {
            bgWorker.RunWorkerAsync();
        };
    }

    void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        Close();
    }

    void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
    }

    void bgWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        var thread = new Thread(() => StartTaskFunc());
        thread.Start();
        int i = 0;
        while (thread.IsAlive)
        {
            if (i == 26)
                i = 0;
            bgWorker.ReportProgress(i);
            Task.Delay(200).Wait();
            i++;
        }
    }
}

【问题讨论】:

  • 听起来您应该只使用选取框进度条,而不是常规进度条,因为您实际上并没有使用任何有意义的进度值更新进度条。
  • 我的建议很好,但是我仍然需要保持表单打开直到线程完成,有什么建议吗?或者你是说在表单的线程上运行任务,然后只显示一个选取框?
  • 您应该在DoWork 处理程序中正确地完成您的工作,而不是创建另一个线程来完成它。因为您正在创建一个新线程,该线程创建一个新线程,然后等待它完成。只是不要创建第二个线程。
  • 我明白你在说什么,我会试试的!谢谢!
  • 工作完美,谢谢!我不知道我为什么要创建另一个线程! :-\

标签: c# multithreading backgroundworker


【解决方案1】:

您正在“bgWorker_DoWork”方法中创建另一个“线程”。

如果您创建另一个线程,则“bgWorker_DoWork”会在新线程创建后立即完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多