UI被卡住,直到后台进程完成
本文关键字:后台进程 UI | 更新日期: 2023-09-27 18:14:51
我有一个.cab
提取实用程序。在我的主窗口中,我想显示正在提取的.cab
的名称,正在提取的文件,以及已完成提取的百分比。
我已经为每个字段编写了属性,即file name
, percentage
等…在我的ViewModel
.
一切正常,但它没有反映在UI
MainVindowViewModel
:
public string FileExtract
{
get
{
return _fileExtract;
}
set
{
_fileExtract = value;
NotifyPropertyChanged("FileExtract");
}
}
public int Percent
{
get
{
return _percent;
}
set
{
_percent = value;
NotifyPropertyChanged("Percent");
}
}
提取方法
private void ExtractCab(string outputDirectory)
{
m_CabinetFile.FileExtractBefore += new EventHandler(CabinetFile_FileExtractBefore);
m_CabinetFile.FileExtractComplete += new EventHandler(CabinetFile_FileExtractComplete);
}
以上两个事件分别在文件提取前后触发。
使用以下方法,我得到所有信息,我需要当驾驶室被提取,但它不反映在UI
private void CabinetFile_FileExtractBefore(object sender, System.EventArgs e)
{
TFile file = (TFile)sender;
FileExtract = file.FullName;
}
private void CabinetFile_FileExtractComplete(object sender, System.EventArgs e)
{
Count++;
Percent = Convert.ToInt32(((decimal)Count / (decimal)m_CabinetFile.FileCount) * 100);
}
FileExtract
和Percent
属性绑定到XAML UI,它在代码中更新,而不是在UI中更新。UI被卡住,直到完整的驾驶室被提取。
始终使用BackgroundWorker
在WPF中进行密集计算。主线程负责UI渲染,如果忙于提取,则无法响应其他请求。
backgroundworker类还提供了回调来报告当前的进度,你可以用它来通知用户在UI。