views:

61

answers:

1

Hi,

I'm a C# programmer.

Now, I'm using the ICSharpCode.SharpZipLib.dll to create a zip file in my current project. But it occurs to me that when I click the button at the SECOND TIME to execute a function to create a zip file, the application will throw an exception, friendly and seriously told me that "Size was zero, but I expected 46086".

I'm so confused that I want to know why? When I click the button at the first time, I can do it successfully without any error.

My related codes are as follows:

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

        // do other things
    }

}

The CreateZip() function's realization is as follows:

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, "");
}

Now, I will show you the recursive calling process:

  1. Call method "UpdateAppAsync" in "ActiveCheckManager" class
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();
}
  1. Call the UpdateApp function asynchronously, in the UpdateApp method, it will only call the UpdateDetail function simply.
private void UpdateDetail(string masterConfig, string category)
{
    IUpdate worker = new HP.ActiveCheckLocalMode.UpdateEngine.UpdateManager();
    worker.UpdateApp(masterConf);
}
  1. The worker.UpdateApp will call UpdateDetail(string, UpdateCategory) only.
private void UpdateDetail(string masterConfig, UpdateCategory cat)
{
    UpdateThread updateThread = new UpdateThread(this, cat);
    updateThread.MasterConfig = masterConfig;
    updateThread.ThreadProc();
}

That is the calling process. When I click the update button second time, it will throw an exception, can you help me? Thank you very much.

+1  A: 

Has the first task thread finished before you start the second time?

I would imagine that File.Delete() and some items in the SharpZipLib to not respond nicelly to multithreadingly zip the same folder simultaneously to the same file.

Promote that " UpdateThread updateThread " as a private member of the "ActiveCheckManager" class, then check if it is already running from a previous click before creating a new thread.

Radu094
Hi, Radu094,Yes, the first task thread has finished before I start the second time click.I would use FastZip to zip the files and dirs under a specified dir, i.e. "C:\Program Files\ABC\DEF" to the destination dir, which is "C:\DOCUME~1\youz\LOCALS~1\Temp". So the File.Delete() is used to delete the half-done zip file last time in the temp file.And then I've tried to promote the updateThread local variable to object global variable, and it also throws the same exception.What's wrong? Should I kill the thread after the execution task?