我有一个运行带有引用它的DLL的winapp。所有主要操作都在DLL中完成。
我喜欢将1000 xml文件存储在一个位置,我必须阅读并将数据存储到另一种格式。
在UI中,我点击一个导入按钮,调用将传递给DLL层,该层将一个xml转换为另一个存储在foreach循环中的位置。
如果一个xml由于格式不正确而失败,该工具必须在我的UI中的文本框中显示一条消息,但该异常发生在dll中。该工具必须继续使用其他XML。
我通过委托知道它可能,但我对如何在DLL和UI之间使用它感到困惑,因为DLL没有文本框句柄。
感谢...
答案 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");
});
}