2013-10-17 3 views
0

위임자, 이벤트, Backgroundworkers, WPF 등을 사용하는 첫 번째 시도입니다. 거의 모든 것이 새로운 것입니다. 나는 CreateShortUrlFile 방법 킥오프 양식의 진행률 표시 줄을 업데이트 할, 내 WPF 양식에서UI 업데이트 외부 메서드의 진행률 표시 줄

public class ShortFileCreator 
{ 
    public void CreateShortUrlFile(string outputfilepath) 
    {   
     foreach(string line in lines) 
     { 
       //work work work processing file 
       if (ReportProgress != null) 
       { 
       //report progress that a file has been processed 
        ReportProgress(this, new ProgressArgs {TotalProcessed = numberofurlsprocessed 
                 , TotalRecords = _bitlyFile.NumberOfRecords}); 
       } 
     } 
    } 

    public delegate void ReportProgressEventHandler (object sender, ProgressArgs args); 

    public event ReportProgressEventHandler ReportProgress; 

    public class ProgressArgs : EventArgs 
    { 
     public int TotalProcessed { get; set; } 
     public int TotalRecords { get; set; } 
    } 
} 

: 나는에 진행 상황을보고 싶습니다 장기 실행 메소드를 실행 외부 클래스가 있습니다. 나는이 프로그램을 실행할 때

private void btnRun_Click(object sender, RoutedEventArgs e) 
    { 
     var shortFileCreator = new ShortFileCreator();   

     _worker = new BackgroundWorker 
     { 
      WorkerReportsProgress = true, 
      WorkerSupportsCancellation = true 
     }; 

     shortFileCreator.ReportProgress += ShortFileCreator_ReportProgress; 

     _worker.DoWork += delegate(object s, DoWorkEventArgs args) 
     { 
      _bitlyFileWorker.CreateShortUrlFile(saveFileDialog.FileName); 
     }; 

     _worker.RunWorkerAsync(); 
    } 

    protected void ShortFileCreator_ReportProgress(object sender, ShortFileCreator.ProgressArgs e) 
    { 
     //update progress bar label 
     txtProgress.Content = String.Format("{0} of {1} Records Processed", e.TotalProcessed, e.TotalRecords); 
     //update progress bar value 
     progress.Value = (double) e.TotalProcessed/e.TotalRecords; 
    } 

은 그러나, 한 줄을 처리 한 후 나는 예외를 얻을 : 다른 스레드가 그것을 소유하고 있기 때문에 호출 스레드가이 개체에 액세스 할 수 없습니다. 다른 스레드가 이걸 소유하고 있습니까? ReportProgress 이벤트가 ProgressArgs를 모든 가입자에게 반환하지 않아야합니까?

답변

1

ProgressBarTextBox과 같은 UI 컨트롤에 다른 스레드가 접근 할 수 없기 때문에 이는 BackgroundWorker 스레드에서 업데이트하려고하기 때문입니다. 이 약

있는 방법 Invoke 다시 UI 스레드에 대한 호출에, 당신은 완벽하게 Dispatcher

protected void ShortFileCreator_ReportProgress(object sender, ShortFileCreator.ProgressArgs e) 
{ 
    Dispatcher.Invoke((Action)delegate 
    { 
     //update progress bar label 
     txtProgress.Content = String.Format("{0} of {1} Records Processed", e.TotalProcessed, e.TotalRecords); 
     //update progress bar value 
     progress.Value = (double) e.TotalProcessed/e.TotalRecords; 
    }); 
} 
+0

작품을 사용하여이 작업을 수행 할 수 있습니다. 고맙습니다. – MickJuice

관련 문제