- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用后台工作程序来处理文件的加载以阻止我的用户界面卡住,但是似乎 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/
我使用的 BackgroundWorker 与以前有点不同。 通常,我使用 BW 来更新一些图形控件,我在 DoWork 方法中执行所有需要的任务,返回结果并为 RunWorkerCompleted
我正在尝试使用 WorkManager 中的 PeriodicWorkRequest 定期从远程 url 获取数据。我已经实现了逻辑,这里的问题是我没有从 Worker 得到任何响应。 但是它似乎在第
这个问题已经以不同的形式被问过很多次,但我没有回答正确,想知道它是否可能不是一个 android 错误。 设置 WorkManager 后,doWork() 会随机调用,有时会连续调用多达 10 次以
我正在寻找在后台线程中运行顺序子过程。我想知道是否可以这样做,方法是创建一个后台工作程序,然后像这样分别调用每个过程... Private Sub BGW_DoWork(ByVal sender As
我正在尝试使用 BackgroundWorker 来完成一项任务。我已经让 worker 正确运行,在 DoWork 方法下它然后调用另一个执行的方法但后来我遇到了我的问题:当该方法试图调用另一个方法
在下面的代码中,有没有一种方法可以不总是订阅 updateWorker_DoWork 方法,而是将它传递给这样的方法 public void GetUpdates(SomeObject blah) {
我正在编写一个基于表单的小型应用程序来连接到 LDAP 服务器,我希望“连接”按钮在后台工作。所以我关注信息和讨论 here 但无论出于何种原因,我的代码似乎都无法正常工作:我在“worker.Run
我正在尝试使用 WorkManager 进行服务器调用。所以,我写了下面的 Worker 类: class ServerCallWorker extends Worker { publ
我想计划任务在 24 小时后从数据库中删除 public class WorkManager extends Worker { public WorkManager(@NonNull Cont
我正在运行一个 BackgroundWorker 线程来完成一项耗时的任务。耗时的任务在另一个类(class)。我需要将在 BackgroundWorker 上运行的这个单独类所取得的进展传递回 Ma
我正在运行一个 BackgroundWorker 线程来完成一项耗时的任务。耗时的任务在另一个类(class)。我需要将在 BackgroundWorker 上运行的这个单独类所取得的进展传递回 Ma
我的问题如下: 我有一个窗口窗体,其中放置了一个 LayoutPanel,当窗体加载时,多个控件,如:文本框和标签被添加到 LayoutPanel。 然后单击按钮,我需要处理用户在那些动态创建的控件上
private void button_uploadToPI_Click(object sender, RoutedEventArgs e) { this.newFilePat
在 form1 之上 label5.Text = "00:00:00"; 在dowork事件中 private void backgroundWorker1_DoWork(object sender,
在我们基于 .NET Framework 的应用程序中,我们使用 BackgroundWorker 保存了一个巨大的文件保持 UI 响应。当我们关闭它时,我们不想停止后台工作(默认行为)并截断文件。
我正在使用后台工作程序来处理文件的加载以阻止我的用户界面卡住,但是似乎 RunWorkerCompleted 在我的 DoWork 事件发生之前完成已完成(退出对话框时导致错误)...我做错了什么吗?
假设我有一个 backgroundWorker1_DoWork,它在数据库中找到一个值并在 e.Result 中返回它。假设我还有一个读取结果的 backgroundWorker1_RunWorker
这是我的设置,这段代码可以正常工作 private void butGo_Click(object sender, EventArgs e) { threadCreateImages.RunWor
我知道 C# 主程序的堆栈大小为 1 MB(32 位和任何)或 4 MB(64 位),请参阅 Why is stack size in C# exactly 1 MB? BackgroundWorke
首先,我贴出我的代码: public partial class MainWindow : Window { private readonly BackgroundWorker worker
我是一名优秀的程序员,十分优秀!