2014-07-25 28 views
0

我有一個.cab提取實用程序。在我的主窗口中,我想顯示正在提取的.cab的名稱,現在正在提取哪個文件,以及完成提取的百分比。用戶界面卡住,直到後臺進程已完成

我已寫入每個字段的屬性,即file namepercentage等等,這些屬於我的ViewModel

所有工作正常,但它不會反映在UI

MainVindowViewModel:分別提取的文件前後

提取

private void ExtractCab(string outputDirectory) 
{ 
    m_CabinetFile.FileExtractBefore += new EventHandler(CabinetFile_FileExtractBefore); 
    m_CabinetFile.FileExtractComplete += new EventHandler(CabinetFile_FileExtractComplete); 
} 

public string FileExtract 
    { 
     get 
     { 
      return _fileExtract; 
     } 
     set 
     { 
      _fileExtract = value; 
      NotifyPropertyChanged("FileExtract"); 
     } 
    } 

    public int Percent 
    { 
     get 
     { 
      return _percent; 
     } 
     set 
     { 
      _percent = value; 
      NotifyPropertyChanged("Percent"); 
     } 
    }  

方法上述兩個事件觸發。

用下面的方法,我得到的是,當越來越提取駕駛室我所需要的所有信息,但它不會反映在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中。用戶界面卡住,直到完成駕駛室被提取。

+0

我的建議是查看'async \ await'功能或'BackgroundWorker'控件。 'BackGroundWorker'比較容易理解,但是在我看來,'async \ await'是現今更好的解決方案,一旦你瞭解了它的工作原理。 – AndreySarafanov

+0

@Sheridan我認爲這是錯誤請求,而不是'如何'發佈。 –

+0

@LIUFA,這是一個問答網站,而不是一個錯誤請求或報告網站。問題作者在他們的BackgroundWorker中顯然存在問題,因此鏈接的問題將幫助他們解決這個問題。 – Sheridan

回答

1

始終使用BackgroundWorker在WPF中進行密集計算。主線程負責UI渲染,如果忙於提取,則無法響應其他請求。

BackgroudWorker類還提供回調來報告當前進度,您可以使用該回調來通知用戶在UI中。