Асинхронное обновление пользовательского интерфейса при возникновении исключения в указанной DLL - PullRequest
0 голосов
/ 27 октября 2010

У меня работает winapp со ссылкой на DLL. все основные операции выполняются в DLL.

У меня около 1000 XML-файлов, которые хранятся в папке, которую я должен прочитать и сохранить в другом формате.

В пользовательском интерфейсе я нажимаю кнопку импорта, и вызов передается слою DLL, который преобразует один xml в другой, сохраненный в месте в цикле foreach.

В случае сбоя одного xml, потому что он не в правильном формате, инструмент должен отобразить сообщение в текстовом поле в моем пользовательском интерфейсе, но исключение происходит в dll. Инструмент должен продолжить работу с другими XML.

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

спасибо ...

1 Ответ

1 голос
/ 27 октября 2010

Вам необходимо использовать события - соответствующий класс в DLL может определять событие, чтобы сигнализировать об успехе / неудаче каждого XML-файла, который может обработать пользовательский интерфейс. Другим способом было бы принять функцию обратного вызова (делегат) в методе для информирования пользовательского интерфейса. Вот простой пример кода:

В DLL:

// delegate that will inform UI
public delegate void FileProcessedHandler(string filePath, bool success);

...

// Method that process files
public void Process(FileProcessedHandler callback)
{

   // loop processing file one by one
   for(..)
   {
      // process one file 
      var success = processFile(filePath);

      // Notify UI
      if (null != callback)
      {
         callback(filePath, success);
      }
   }
}

В интерфейсе пользователя:

...
// code that invokes DLL for processing file
// must invoked on the different thread so that UI will remain responsive
ThreadPool.QueueUserWorkItem(o => { [object from DLL].Process(OnFileProcessed); });

....

// Callback method (assuming inside control/form)
public void OnFileProcessed(string filePath, bool success)
{
   // Its important to marshal call to UI thread for updating UI
   this.Invoke(() => {
      Text1.Text = string.Format("File: {0}, Processed: {1}", filePath, success? "Success": "Failure");
   });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...