gpt4 book ai didi

c# - BackgroundWorker 在 DoWork 之前完成

转载 作者:太空宇宙 更新时间:2023-11-03 20:15:49 25 4
gpt4 key购买 nike

我正在使用后台工作程序来处理文件的加载以阻止我的用户界面卡住,但是似乎 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) 之类的检查但无济于事..

编辑2错误是 NRE,因为尚未加载设计,我可以轻松解决此问题,但宁愿让线程正常工作。

最佳答案

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

  • 测试 bw.IsBusy 并且在它为真时启动 worker 是一个严重的错误。它永远不会在发布的代码中忙碌,但如果它实际上可能是真的,那么你的代码中就有一个讨厌的错误。因为您实际上确实订阅了忙碌的工作人员的事件。现在 RunWorkerCompleted 事件处理程序将运行两次。

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

  • 代码中存在竞争,工作人员可以在对话框显示之前完成。对话框只能在创建其 native 窗口时关闭。换句话说,IsHandleCreated 必须为真。您必须将其互锁以确保永远不会发生这种情况。订阅对话框的 Load 事件以启动 worker。

  • 您盲目地假设 worker 会完成工作并产生结果。当它的 DoWork 方法死于异常时,情况就不会这样了。它被 BackgroundWorker 捕获并作为 e.Error 属性传递给 RunWorkerCompleted 事件处理程序。您必须检查此属性并在它不为空时做一些合理的事情。

从评论来看,我猜后一个项目符号是原因。您可以使用 Debug + Exceptions 对其进行调试,勾选 CLR 异常的 Thrown 复选框。调试器现在会在抛出异常时停止,让您找出问题所在。

关于c# - BackgroundWorker 在 DoWork 之前完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16808268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com