【发布时间】: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