【问题标题】:UI stuck until background process has completed [duplicate]UI 卡住,直到后台进程完成 [重复]
【发布时间】:2014-07-25 09:06:27
【问题描述】:

我有一个.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 一直卡住,直到提取了完整的驾驶室。

【问题讨论】:

  • 我的建议是查看async\await 功能或BackgroundWorker 控件。 BackGroundWorker 更容易理解,但在我看来,async\await 现在是更好的解决方案,只要您了解它的工作原理。
  • @Sheridan 我认为这是错误请求,而不是“如何”发布。
  • @LIUFA,这是一个问答网站,不是错误请求或报告网站。问题作者的BackgroundWorker 很明显有问题,所以链接的问题将帮助他们解决这个问题。

标签: c# wpf


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    相关资源
    最近更新 更多