2010-08-06 27 views
6

我是C#程序員。我的申請有什麼問題----大小是0,但我預計46806!

現在,我正在使用ICSharpCode.SharpZipLib.dll在我當前的項目中創建一個zip文件。但是當我點擊SECOND TIME執行一個函數來創建一個zip文件時,我發現應用程序會拋出一個異常,很友好並且認真地告訴我「Size爲零,但我預計46086」 。

我很困惑,我想知道爲什麼?當我第一次點擊按鈕時,我可以成功地完成任何錯誤。

我的相關代碼如下:

internal void ThreadProc() 
{ 
    try 
    { 
     ZipHelper.CreateZip(backupZipFile, Constants.HomeConstant, true); 

     // do other things 
    } 

} 

的CreateZip()函數的實現如下:

public static void CreateZip(string zipFileName, string sourceDirectory, bool recurse) 
{ 
FastZip zip = new FastZip(); 

if (File.Exists(zipFileName)) 
{ 
     File.Delete(zipFileName); 
} 

zip.CreateZip(zipFileName, sourceDirectory, true, ""); 
} 

現在,我會告訴你的遞歸調用進程:

  1. 「ActiveCheckManager」類中的調用方法「UpdateAppAsync」
public void UpdateAppAsync(string masterConfig) 
{ 
    this.masterConf = masterConfig; 

    Thread actualThread = new Thread(new ThreadStart(UpdateApp)); 
    actualThread.IsBackground = true; 
    actualThread.CurrentCulture = Thread.CurrentThread.CurrentCulture; 
    actualThread.CurrentUICulture = Thread.CurrentThread.CurrentUICulture; 
    actualThread.Start(); 
} 
  • 調用UpdateApp函數異步,在UpdateApp方法,它將只簡單地調用UpdateDetail功能。
  • private void UpdateDetail(string masterConfig, string category) 
    { 
        IUpdate worker = new HP.ActiveCheckLocalMode.UpdateEngine.UpdateManager(); 
        worker.UpdateApp(masterConf); 
    } 
    
  • 的worker.UpdateApp將調用UpdateDetail只(字符串,UpdateCategory)。
  • private void UpdateDetail(string masterConfig, UpdateCategory cat) 
    { 
        UpdateThread updateThread = new UpdateThread(this, cat); 
        updateThread.MasterConfig = masterConfig; 
        updateThread.ThreadProc(); 
    } 
    

    這是調用進程。當我第二次點擊更新按鈕時,它會拋出異常,你能幫我嗎?非常感謝你。

    +2

    從哪裏拋出異常(即:哪一行實際上是打破的)?堆棧跟蹤可能會有所幫助。 – cHao 2010-08-06 07:59:30

    +0

    也許你需要處理一些東西,或關閉zip文件。什麼是異常的類型? – leppie 2010-08-06 08:00:28

    回答

    1

    在第二次啓動之前是否完成了第一個任務線程?

    我會想象File.Delete()和SharpZipLib中的某些項目不會很好地響應多線程將同一文件夾同時壓縮到同一個文件。

    作爲「ActiveCheckManager」類的私有成員提升「UpdateThread updateThread」,然後在創建新線程之前檢查它是否已經從先前的點擊運行。

    +0

    嗨,Radu094, 是的,第一個任務線程已經完成,然後我開始第二次點擊。 我會使用FastZip壓縮指定目錄下的文件和目錄,即「C:\ Program Files \ ABC \ DEF」到目標目錄,即「C:\ DOCUME〜1 \ youz \ LOCALS〜1 \ Temp」。因此,File.Delete()用於在臨時文件中上次刪除半做的zip文件。 然後我試圖將updateThread局部變量提升爲對象全局變量,並且它也引發相同的異常。 怎麼了?執行任務後我應該殺死線程嗎? – user412681 2010-08-09 03:38:51

    相關問題