2015-01-29 1 views
-2

У меня есть проект окон, в котором я застегиваю папку. Форма замораживается в течение 3-4 секунд, а затем выполняется операция.Форма замораживается в течение x секунд, когда zip-папка в C#

private void ZipSafe(string p_FolderName, string p_ArchiveName) 
{ 
    try 
    { 
     if (File.Exists(p_ArchiveName)) 
      File.Delete(p_ArchiveName); 

     string[] l_DataSet = Directory.GetFiles(p_FolderName, "*.txt"); 
     using (ZipArchive l_Zip = ZipFile.Open(p_ArchiveName, ZipArchiveMode.Create)) 
     { 
      foreach (string l_File in l_DataSet) 
      { 

       using (FileStream l_Stream = new FileStream(l_File, FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite)) 
       { 
        ZipArchiveEntry l_ZipArchiveEntry = l_Zip.CreateEntry(Path.GetFileName(l_File), CompressionLevel.Optimal); 
        using (Stream l_Destination = l_ZipArchiveEntry.Open()) 
        { 
         l_Stream.CopyTo(l_Destination); 
        } 
       } 
      } 
      l_Zip.Dispose(); 
     } 
    } 
    catch (System.Exception e) 
    { 
     using (StreamWriter sw = new StreamWriter(@"C:\Users\**\Documents\ErrorZip.txt")) 
     { 
      string l = e.ToString(); 
      sw.WriteLine(l); 
      sw.Close(); 
     } 
    } 
} 

Я вызываю эту функцию при нажатии на кнопку. Я попытался использовать отладчик, чтобы понять, что здесь происходит. Замораживание происходит во время второй итерации для-каждого цикла, для следующей строки кода:

l_Stream.CopyTo(l_Destination); 

Я знаю, что было много сообщению о проносясь папки в C#, все-таки я надеюсь, что мой вопрос актуален , Любая помощь будет отличной, заблагорассудившись, парень.

Иметь хороший день, vbvx

+0

Использование фона рабочего? –

+1

В чем вопрос? – Default

+0

Почему он замерзает и могу ли я предотвратить его замораживание? – vbvx

ответ

0

Это происходит потому, что вы используете поток пользовательского интерфейса для выполнения операции. Вам нужно запустить операцию в другом потоке, чтобы освободить поток пользовательского интерфейса (т. Е. Остановить приложение от замораживания).

попробовать:

private void ZipSafe(string p_FolderName, string p_ArchiveName) 
{ 
Task.Factory.StartNew(() => 
{ 
try 
{ 
    if (File.Exists(p_ArchiveName)) 
     File.Delete(p_ArchiveName); 

    string[] l_DataSet = Directory.GetFiles(p_FolderName, "*.txt"); 
    using (ZipArchive l_Zip = ZipFile.Open(p_ArchiveName, ZipArchiveMode.Create)) 
    { 
     foreach (string l_File in l_DataSet) 
     { 

      using (FileStream l_Stream = new FileStream(l_File, FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite)) 
      { 
       ZipArchiveEntry l_ZipArchiveEntry = l_Zip.CreateEntry(Path.GetFileName(l_File), CompressionLevel.Optimal); 
       using (Stream l_Destination = l_ZipArchiveEntry.Open()) 
       { 
        l_Stream.CopyTo(l_Destination); 
       } 
      } 
     } 
     l_Zip.Dispose(); 
    } 
} 
catch (System.Exception e) 
{ 
    using (StreamWriter sw = new StreamWriter(@"C:\Users\**\Documents\ErrorZip.txt")) 
    { 
     string l = e.ToString(); 
     sw.WriteLine(l); 
     sw.Close(); 
    } 
} 
} 
} 
+0

Привет, спасибо за ответ. Кажется, это ничего не помогает, и сегодня эта форма никогда не размораживается, поэтому я думаю, что это что-то еще? Я не могу получить исключение, записанное в текстовом файле «ErrorZip.txt». – vbvx

+0

В конце концов, размеры файлов, которые я сжимал, были очень большими. Но я думаю, ваше замечание является хорошим дополнением в любом случае, поэтому это заметный ответ. Кстати, я бы хотел, чтобы комментарии со снижением, легче улучшить себя, когда вы понимаете, что не так. – vbvx