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);
    }

FileExtractPercent属性绑定到XAML UI,它在代码中更新,而不是在UI中更新。UI被卡住,直到完整的驾驶室被提取。

UI被卡住,直到后台进程完成

始终使用BackgroundWorker在WPF中进行密集计算。主线程负责UI渲染,如果忙于提取,则无法响应其他请求。

backgroundworker类还提供了回调来报告当前的进度,你可以用它来通知用户在UI。