在引用的DLL中发生异常时,异步更新UI

时间:2010-10-27 06:29:10

标签: c# .net winforms delegates

我有一个运行带有引用它的DLL的winapp。所有主要操作都在DLL中完成。

我喜欢将1000 xml文件存储在一个位置,我必须阅读并将数据存储到另一种格式。

在UI中,我点击一个导入按钮,调用将传递给DLL层,该层将一个xml转换为另一个存储在foreach循环中的位置。

如果一个xml由于格式不正确而失败,该工具必须在我的UI中的文本框中显示一条消息,但该异常发生在dll中。该工具必须继续使用其他XML。

我通过委托知道它可能,但我对如何在DLL和UI之间使用它感到困惑,因为DLL没有文本框句柄。

感谢...

1 个答案:

答案 0 :(得分:1)

您需要使用事件 - DLL中的相关类可以定义事件以指示UI可以处理的每个xml文件的成功/失败。另一种方法是接受方法中的回调函数(委托)来通知UI。这是一个简单的示例代码:

在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");
   });
}