我正在使用一个后台工作线程来处理文件的加载,以防止我的用户界面冻结,但是似乎RunWorkerCompleted
在我的DoWork
事件完成之前就完成了(退出对话框时导致错误)...我做错了什么吗?我这样做比做一个任务更好吗?
public static <T> LoadDesign(string xmlPath)
{
PleaseWait pw = new PleaseWait(xmlPath);
pw.ShowDialog();
return pw.design;
}
private PleaseWait(string xmlFile)
{
InitializeComponent();
bw = new BackgroundWorker();
bw.WorkerSupportsCancellation = true;
bw.DoWork += (s, e) =>
{
design = (Cast)DllCall containing XmlSerializer.Deserialize(...,xmlFile);
};
bw.RunWorkerCompleted += (s, e) => {
//Exit please wait dialog
this.Close();
};
if (!bw.IsBusy)
bw.RunWorkerAsync();
}
我相信这个问题可能是因为我的后台工作者正在调用一个dll而没有等待响应。我已经尝试添加检查,如while(design == null)
,但没有效果。
Edit2错误为NRE,因为设计尚未加载,我可以轻松修复此错误,但我更希望线程工作正常。
3条答案
按热度按时间fdx2calv1#
这里有很多小错误。考虑到我们可能没有看到真实的的代码,并且我们没有一个带有调用栈窗口的调试器来查看它实际上在哪里崩溃,它们中的任何一个都可能是一个因素。
从评论中判断,我猜后一点是原因。您可以使用Debug + Exceptions来调试这个问题,勾选CLR异常的Thrown复选框。调试器现在将在抛出异常时停止,让您找出错误所在。
sulc1iza2#
也许你的后台工作者实际上并没有花费太多的时间就完成了对话框的显示。我建议把后台工作者的初始化和启动代码转移到
PleaseWait
的Form_Load或Form_Shown1qczuiv03#
如果在BackgroundWorker _DoWork事件中调用另一个异步函数,
喜欢;
_RunWorkerCompleted甚至在已完成_Dowork事件之前激发
将其他somethingsToDoAsync()函数更改为非异步。