위임자, 이벤트, 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를 모든 가입자에게 반환하지 않아야합니까?
작품을 사용하여이 작업을 수행 할 수 있습니다. 고맙습니다. – MickJuice