UI一直停留,直到后台进程完成

时间:2014-07-25 09:06:27

标签: c# wpf

我有一个.cab提取工具。在我的主窗口中,我想显示正在提取的.cab的名称,正在提取的文件以及提取的百分比。

我已经为每个字段编写了属性,即file namepercentage等,这些属于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被卡住,直到完整的cab被提取出来。

1 个答案:

答案 0 :(得分:1)

始终使用BackgroundWorker在WPF中进行密集计算。主线程负责UI呈现,如果忙于解压缩,则无法响应其他请求。

BackgroudWorker类还提供回调以报告当前进度,您可以使用它来通知UI中的用户。