RJ.*_*RJ. 1 c# forms multithreading freeze
private void btnUpload_Click(object sender, EventArgs e)
{
progressbar.value = 10;
RunLongProcess();
progressbar.value = 20;
RunAnotherLongProcess();
progressbar.value = 50;
RunOneMoreLongProcess();
progressbar.value = 100;
}
Run Code Online (Sandbox Code Playgroud)
上面代码的问题是应用程序冻结,我看不到进度条正常运行。
处理这种情况的正确方法是什么?考虑到我不想同时运行两件事,我不确定为什么会发生这种情况。一次只做一件事。我需要刷新应用程序或类似的东西吗?
事情冻结正是因为你没有“同时运行多个事情”。
您正在事件处理程序中针对按钮单击执行长时间运行的操作。在该事件处理程序返回之前,UI 会被阻止。
尝试将长时间运行的进程放入另一个线程中,例如使用Task或BackgroundWorker。
另一个线程可以更新进度条。但是,请记住,单独的线程需要正确访问 UI 线程。确切的机制取决于您是否在谈论 WinForms、WPF 还是其他东西(您的问题中未指定)。
这是我最喜欢的从 WinForms 非 UI 线程更新控件的方法:
更新
这是一个例子。我手边没有 IDE,所以可能会出现一些小问题。
private BackgroundWorker worker = new BackgroundWorker();
public MyForm() // Your form's constructor
{
InitializeComponent();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
}
private void btnUpload_Click(object sender, EventArgs e)
{
if (!worker.IsBusy) // Don't start it again if already running
{
// Start the asynchronous operation.
// Maybe also disable the button that starts background work (btnUpload)
worker.RunWorkerAsync();
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
worker.ReportProgress(10);
RunLongProcess();
worker.ReportProgress(20);
RunAnotherLongProcess();
worker.ReportProgress(50);
RunOneMoreLongProcess();
worker.ReportProgress(100);
}
// This event handler updates the progress.
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressbar.value = e.ProgressPercentage;
}
// This event handler deals with the results of the background operation.
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// Inform the user that work is complete.
// Maybe re-enable the button that starts the background worker
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1720 次 |
| 最近记录: |