Что не так с моим приложением ---- Размер был 0, но я ожидал 46806! - PullRequest
6 голосов
/ 06 августа 2010

Я программист на C #.

Теперь я использую ICSharpCode.SharpZipLib.dll , чтобы создать zip-файл в моем текущем проекте.Но мне приходит в голову, что когда я нажимаю кнопку в SECOND TIME , чтобы выполнить функцию для создания zip-файла, приложение выдает исключение, дружелюбно и серьезно говорит мне, что «Размер был нулевым, ноЯ ожидал 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. Вызовите метод "UpdateAppAsync" в классе "ActiveCheckManager"
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 (string, UpdateCategory).
private void UpdateDetail(string masterConfig, UpdateCategory cat)
{
    UpdateThread updateThread = new UpdateThread(this, cat);
    updateThread.MasterConfig = masterConfig;
    updateThread.ThreadProc();
}

Это вызывающий процесс.Когда я нажму кнопку обновления во второй раз, произойдет исключение, вы можете мне помочь?Большое спасибо.

1 Ответ

1 голос
/ 06 августа 2010

Закончена ли первая цепочка задач перед вторым запуском?

Я полагаю, что File.Delete () и некоторые элементы в SharpZipLib не реагируют на многопоточное сжатие одной и той же папки одновременно в один и тот же файл.

Продвигайте «UpdateThread updateThread» как закрытый член класса «ActiveCheckManager», затем проверяйте, работает ли он уже с предыдущего щелчка, прежде чем создавать новый поток.

...