ContextSwitchDeadlock при переносе файлов - C#

Узнай цену своей работы

Формулировка задачи:

Эта ошибка возникает при попытке перенести все файлы из одной папки в другую "CLR не удалось перейти из COM-контекста 0x7fb6f0 в COM-контекст 0x7fb638 за 60 секунд. Наиболее вероятно, что поток, владеющий контекстом/апартаментом назначения, находится в режиме ожидания или выполнения очень длительной операции без прокачки сообщений Windows. Обычно эта ситуация отрицательно влияет на производительность и даже может привести к зависанию приложения или чрезмерному расходованию памяти. Чтобы избежать этой проблемы, все потоки однопоточного апартамента (STA) должны использовать примитивы ожидания для прокачки (например, CoWaitForMultipleHandles) и периодически прокачивать сообщения во время длительных операций."

Решение задачи: «ContextSwitchDeadlock при переносе файлов»

textual
Листинг программы
public void DiskOrUSB(FileInfo[] source, FileInfo[] path, string folderD, string folderU)
        {
            int i = 0;
            int l;
            if (path.Length > source.Length) { l = path.Length; } else { l = source.Length; }
                while (i < (l+1))
            {
                   try
                {
                    string fo = folderU + ((source[i].Directory).ToString()).Remove(0, folderD.Length);
                    string fo1 = folderD + ((path[i].Directory).ToString()).Remove(0, folderU.Length);
                    string CFile = fo + "\" + source[i].Name;
                    if (!Directory.Exists(fo))
                    {
                        Directory.CreateDirectory(fo);
                        listBox1.Items.Add(fo);
                    }
                    if (!File.Exists(fo + "\" + source[i].Name))
                    {
                        source[i].CopyTo(fo);
                        listBox1.Items.Add(source[i] + "__" + fo);
                    }
                    if (!File.Exists(CFile))
                    {
                        path[i].Delete();
                    }
                    if (File.Exists(fo + "\" + source[i].Name))
                    {
                        if (source[i].LastWriteTime != File.GetLastWriteTime(CFile))
                        {
                            File.Delete(CFile);
                            source[i].CopyTo(fo);
                            listBox1.Items.Add(CFile);
                        }
                    }
                    progressBar1.Value = (90 * i / l) + 10;
                        ++i;
 
                }
                    catch { }
            }
 
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4 из 5
Похожие ответы