2014-10-13 2 views
0

스레드를 차단하여 양식의 구성 요소를 업데이트하려고합니다.C# 양식 스레드를 차단하지 않고 진행 막대를 업데이트하십시오.

내 프로그램은 DotNetZip을 사용하여 파일을 아카이브에 추가하며 진행률을 보여주기 위해 진행률 막대를 업데이트하려고합니다.

SaveProgress 메서드는 Save()가 시작될 때 호출됩니다. 각 항목이 쓰여지기 전과 저장()이 완료 될 때.

레이블이 업데이트되지 않고 progressBar1이 업데이트되지 않습니다.

private void buttonCompress_Click(object sender, EventArgs e) 
{ 
    if ((folderBrowserDialog1.ShowDialog() == DialogResult.OK) && (saveFileDialog1.ShowDialog() == DialogResult.OK)) 
    { 
     buttonCompress.Enabled = false; 

     String DirectoryToZip = folderBrowserDialog1.SelectedPath; 
     String ZipFileToCreate = saveFileDialog1.FileName; 

     using (ZipFile zip = new ZipFile()) 
     { 
      zip.CompressionLevel = Ionic.Zlib.CompressionLevel.Default; 
      zip.SaveProgress += SaveProgress; 

      zip.StatusMessageTextWriter = System.Console.Out; 
      zip.AddDirectory(DirectoryToZip); // recurses subdirectories 
      zip.Save(ZipFileToCreate); 
     } 
    } 
} 
+0

배경 작업자 사용 ... http://www.dotnetperls.com/backgroundworker ... http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29. aspx? cs-save-lang = 1 & cs-lang = csharp # 코드 스 니펫 -9 – Prix

답변

0

압축이 매우 CPU를 많이 사용, 그것은 당신의 UI 스레드를 동결 물론, 대신에 대한 백그라운드 스레드를 사용 또한

private void buttonCompress_Click(object sender, EventArgs e) 
{ 
    if ((folderBrowserDialog1.ShowDialog() == DialogResult.OK) && (saveFileDialog1.ShowDialog() == DialogResult.OK)) 
    { 
     buttonCompress.Enabled = false; 

     String DirectoryToZip = folderBrowserDialog1.SelectedPath; 
     String ZipFileToCreate = saveFileDialog1.FileName; 

     // fire off zipping job in a background thread 
     Task.Factory.StartNew(() => StartZipping(DirectoryToZip, ZipFileToCreate), TaskCreationOptions.LongRunning); 
    } 
} 

private object StartZipping(string DirectoryToZip, string ZipFileToCreate) 
{ 
    using (ZipFile zip = new ZipFile()) 
    { 
     zip.CompressionLevel = Ionic.Zlib.CompressionLevel.Default; 
     zip.SaveProgress += SaveProgress; 

     zip.StatusMessageTextWriter = System.Console.Out; 
     zip.AddDirectory(DirectoryToZip); // recurses subdirectories 
     zip.Save(ZipFileToCreate); 
    } 
} 

하면 SaveProgress 이벤트 핸들러가 지금에서 호출되기 때문에 UI 스레드를 UI 스레드로 마샬링하려면 UI 스레드를 변경해야합니다.

관련 문제