2013-05-29 117 views
2

我正在使用后台工作来处理加载文件以阻止我的UI冻结,但看起来RunWorkerCompleted在我的DoWork事件完成之前完成(退出对话框时导致错误)。有什么我做错了吗?我最好在任务上做这件事吗?BackgroundWorker在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的设计还没有被加载,我可以很容易地解决这个问题,但更希望得到的,而不是穿线工作。

+0

如果您想要答案,请提供有关核心代码的完整详细信息。这个'(cast)DllCall'太伪代码了。 –

+0

@HenkHolterman - 我已经添加了这个方法,但是我看不到它有多相关? (也正在添加'使用dll') – Sayse

+0

你看到了什么错误? – YK1

回答

3

有很多小错误。鉴于我们可能没有查看真实的代码,并且我们没有调用堆栈窗口的调试器来查看它实际崩溃的位置,其中任何一个都可能是一个因素。

  • 测试bw.IsBusy和开始时工人是真的是一个严重的错误。它不能像发布的那样在代码中忙碌,但如果它真的有可能是真的,那么你的代码中就有一个令人讨厌的bug。因为你实际上确实订阅繁忙工人的事件。现在RunWorkerCompleted事件处理程序将运行两次。

  • 使用Close()方法关闭对话框不正确。对话框应该通过分配DialogResult属性来关闭。不是最严重的错误,但错误。

  • 代码中存在竞争,工作人员可以在对话框显示之前完成。只有在创建本机窗口时才能关闭对话框。换句话说,IsHandleCreated必须是真的。你必须互相联系,以确保永远不会发生。订阅对话框的Load事件以启动员工。

  • 你一味地认为工人会完成工作并产生结果。当DoWork方法死于异常时不会出现这种情况。它由BackgroundWorker捕获并作为e.Error属性传递给RunWorkerCompleted事件处理程序。你必须检查这个属性,并做一些合理的,如果它不为null。

从评论来看,我猜想后一颗子弹是原因。你可以使用Debug + Exceptions来调试,勾选Thrown复选框以查看CLR异常。当抛出异常时,调试器现在会停止,从而让您发现哪里出了问题。

+0

谢谢你汉斯,你的确是对我的盲目是正确的假设。我会期待这个错误被抛出?另外,你有什么参考,为什么我应该使用DialogResult?我很好奇... – Sayse

+0

当然抛出异常。并且被捕获,所以它可以传递给RunWorkerCompleted事件处理程序。这是故意的设计,BGW不会那么受欢迎,因为它可能经常导致程序崩溃。我会推荐任何关于Winforms编程的书籍,以了解更多关于对话框的内容。有很多好的可用。或者只需点击提问问题按钮。 –

1

在显示对话框之前,您的后台工作人员可能不需要太多时间和完成工作。我建议将后台工作者初始化,并启动代码到PleaseWait的Form_Load或Form_Shown

+1

我甚至会将它转换为'Shown',因为这是显示表单时触发的事件。 “载入”可能会在“显示”之前被调用。 –

+0

是的同意你 - 同时更新我的​​答案。 – YK1

+0

我appologise YK1错误是不是与形式做。关闭,但我可以理解为什么它看起来像这样,并感谢您的答案..我会更新问题 – Sayse

相关问题