2016-11-03 3 views
1

В настоящее время я пишу приложение, которое экспортирует определенные области данных некоторых файлов Excel в виде файлов изображений в папку изображений, а затем отображает их. Программа также должна иметь возможность обновлять все файлы (включая их) во время отображения файла.Используйте файл по 2 потокам в то же самое время

Проблема:

Метод ExportRangeAsImage(), который экспортирует область данных файла Excel файлов изображений, называется в качестве фона рабочего, который реализуется в одном классе (ViewModel). Если обновление файла запускается в то время как он отображается в то же время, я получаю следующее сообщение об ошибке:

// ExportRangeAsImage() { 
    ... 

System.Windows.Application.Current.Dispatcher.BeginInvoke(
     DispatcherPriority.Normal, new System.Action(() => 
     { 
      Bitmap image = new Bitmap(System.Windows.Forms.Clipboard.GetImage()); 

      if (!file.Contains("XYZ")) 
      { 
       //The program stops here 
       image.Save(ImagePathM1 + Path.GetFileNameWithoutExtension(file) + ".svg");     Marshal.ReleaseComObject(ExcelApp); 
      } 
     })); 

An unhandled exception of type 'System.Runtime.InteropServices.ExternalException' occurred in System.Drawing.dll Additional information: A generic error occurred in GDI+.**

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

Можете ли вы помочь мне решить эту проблему ???

+1

Если это ваша забота, решение таково: используйте разные имена файлов в каждом потоке. Вау! Как еще мы можем вам помочь? –

+0

Это не имеет никакого отношения к файлам. Очевидно, ошибка в UI –

+0

@PanagiotisKanavos. Я уверен (http://stackoverflow.com/questions/27438058/image-save-method-is-not-save-image-gdi-error-ccured) что [шансы] (http://stackoverflow.com/questions/15862810/a-generic-error-occured-in-gdi-in-bitmap-save-method) [довольно высокие] (http: // stackoverflow. com/q/5813633/6682181), что он [должен сделать] (http://stackoverflow.com/q/29973934/6682181) с [файлами и многопоточными] (http://stackoverflow.com/q/7694741/6682181). Но, конечно, это также может быть [формат файла] (http://stackoverflow.com/q/1053052/6682181). – haindl

ответ

1

Я предполагаю, что ImagePathM1 активен в вашем потоке графического интерфейса пользователя, и это корень проблемы в другом потоке, который пытается получить доступ к общему ресурсу defacto. Передайте значение ImagePathM1 во вторичный поток вместо того, чтобы иметь доступ к потоку ImagePathM1.

+0

Проблема исправлена ​​:)! – Guilian

Смежные вопросы