- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何获得有意义的BackgroundWorker.Error
当DoWork
必须调用可能引发异常的委托(delegate)?
我正在实现一个静态 MsgBox
公开向用户传达自定义消息的各种方式(使用自定义消息表单)的类。
公开的方法之一,ShowProgress
, 实例化一个 ProgressMessageBoxForm
(源自自定义 MessageBoxForm
),它在某些后台操作发生时显示进度条(让用户一直取消操作)。如果在模态表单上运行后台任务听起来很尴尬,请考虑这样的签名:
public static DialogResult ShowProgress(string title, string message, _
Action<AsyncProgressArgs> progressAction)
AsyncProgressArgs
有问题的类(class):
public class AsyncProgressArgs
{
private readonly Action<int, string> _update;
private readonly BackgroundWorker _worker;
private readonly DoWorkEventArgs _workEventArgs;
public AsyncProgressArgs(Action<int, string> updateProgress, BackgroundWorker worker, DoWorkEventArgs e)
{
_update = updateProgress;
_worker = worker;
_workEventArgs = e;
}
/// <summary>
/// Reports progress to underlying <see cref="BackgroundWorker"/>.
/// Increments <see cref="ProgressBar"/> value by specified <see cref="int"/> amount and
/// updates the progress <see cref="Label"/> with specified <see cref="string"/> caption.
/// </summary>
public Action<int, string> UpdateProgress { get { return _update; } }
/// <summary>
/// Verifies whether asynchronous action is pending cancellation,
/// in which case asynchronous operation gets cancelled.
/// </summary>
public void CheckCancelled()
{
_workEventArgs.Cancel = _worker.CancellationPending;
}
}
BackgroundWorker
的
DoWork
事件处理程序然后调用传递给自定义消息框的方法
protected virtual void worker_DoWork(object sender, DoWorkEventArgs e)
{
// *** If RunWorkerCompletedEventArgs.Error caught exceptions,
// then this try/catch block wouldn't be needed:
// try
// {
_startHandler(this, new AsyncProgressArgs(UpdateProgressAsync, _worker, e));
// }
// catch(Exception exception)
// {
// if (MsgBox.Show(exception) == DialogResult.Retry)
// {
// BeginWork(_startHandler);
// }
// else
// {
// Hide();
// }
// }
}
private void AsyncProgressAction(AsyncProgressArgs e)
{
// do some work:
Thread.Sleep(200);
// increment progress bar value and change status message:
e.UpdateProgress(10, "Operation #1 completed.");
// see if cancellation was requested:
e.CheckCancelled();
// do some work:
Thread.Sleep(500);
// increment progress bar value and change status message:
e.UpdateProgress(30, "Operation #2 completed.");
// see if cancellation was requested:
e.CheckCancelled();
// ...
// throw new Exception("This should be caught by the BackgroundWorker");
}
MsgBox.ShowProgress("Async Test", "Please wait while operation completes.", _
AsyncProgressAction);
BackgroundWorker
将捕获它并将其存储在其
Error
中属性(property),但这里不会发生。
Error
过程完成时的属性(property)?我希望能够
Throw new Exception()
在 action 方法中的任何地方,并在封装的 worker 中处理它。
BackgroundWorker
因为与
Task
在完成所有工作之前我无法移动进度条,我想避免处理
Thread
直接对象实例。
BackgroundWorker
以某种方式
catch
异常和调试器继续运行,但事实证明异常被捕获并且调试器仍然中断。
最佳答案
我之前应该读过这个: Unhandled exceptions in BackgroundWorker 。
这是一个非常非常长的问题,对于一个简单的非问题有很多上下文:VS调试器停止并误导性地说“用户代码未处理异常”,就像未处理的异常一样......当它实际上意味着“BackgroundWorker 任务引发了异常,调试器会通知您,否则您会认为 BackgroundWorker 正在吞噬它。”
异常可以 F5'd/忽略以恢复执行,异常确实如预期的那样以 RunWorkerCompletedEventArgs.Error
结束,并且部署的应用程序不会在用户面前爆炸。
发布此答案以从(溢出?)一堆未回答的问题中删除此问题...
关于multithreading - BackgroundWorker 中的异步错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14791603/
在我的应用程序中,我在添加到我的列表框之前通过打开的 Wireshark 进程检查我的文件。这是添加目录单击事件,它获取根文件夹并检查此文件夹和子文件夹中的所有文件: private void btn
我有一个使用异步后台工作程序执行批处理文件的程序。这是代码: public static void Execute(CmdObj obj, bool batch) { CmdObj = obj
我正在尝试在项目中执行数据库密集型任务。这是一个演练: 我们需要搜索我们的 worker 数据库,我们称之为 Locums,并找到一个适合特定工作的人。当我们决定处理 x 个作业时,此过程开始。因此,
首先,我还是个初学者,如果您能耐心一点,我将不胜感激:) 今天我一直在为这件事绞尽脑汁。 问题是,我想运行三个不同的后台程序。但是我想等到一个运行完再运行下一个,依此类推。 每个后台 worker 都
我需要确保 BackgroundWoker 在被调用之前不忙,所以我检查 IsBusy 并调用 CancelAsync如果是: if (bgWorker.IsBusy)
我的目标是: 用户在组合框中输入完整或部分计算机名 按钮单击事件启动后台工作程序将计算机名传递给 DoWork 方法 DoWork 方法在 ActiveDirectory 中搜索计算机名并将集合传递给
每次我的代码需要与网络或数据库通信时,我都会使用后台工作人员,我是否可以使用太多,执行这些任务的正确方法是什么? 如果我不使用后台工作程序,则在远程主机关闭等情况下,gui会锁定,因此使用后台工作程序
关于 BGW 长期运行的任何想法建议? 最佳答案 是的 :)。在 BackgroundWorker 或 ThreadPool 中进行长时间运行的操作并没有本质上的错误……如果由于长时间运行的操作而导致
学习构建多线程 WPF 应用程序我读到了一些使用 BackgroundWorker 的限制,这对我来说不是很清楚。请帮我理解: 如果我不仅想要一个线程在 UI 的幕后工作,而且可能有多个线程,它们彼此
问题:重新使用 .NET Backgroundworker,有没有办法让异常正常传递回主线程? 背景: 目前在我的 WinForms 应用程序中,我有通用异常句柄,如果(a)自定义应用程序异常然后呈现
在尝试实现一个简单的 BackgroundWorker 时,我遇到了臭名昭著的“跨线程操作无效”异常。我花了几个小时阅读我能找到的关于这个主题的所有内容,包括关于 SO 的许多相关问题,但我就是不明白
有没有办法缩短我的 BackgroundWorker.CancellationPending 检查点? 例如,有没有办法像下面的示例代码一样封装return: //REAL CODE (CURRENT
嗨,我在处理完成后,无法将在BackgroundWorker的DoWork处理程序内部生成的图像数据分配给图像对象。我收到一条错误消息,指出“调用线程无法访问此对象,因为其他线程拥有它”。错误行是 P
如何获得有意义的BackgroundWorker.Error当DoWork必须调用可能引发异常的委托(delegate)? 我正在实现一个静态 MsgBox公开向用户传达自定义消息的各种方式(使用自定
我知道您可以在首次启动 backgroundworker 时通过 RunWorkerAsync 函数调用传递参数,但是您可以在它已经启动后向它传递数据吗?或者我是否需要创建自己的并发形式来处理从不同线
我有一个风格问题,关于我应该在 Windows 窗体应用程序上使用的后台线程实现的选择。目前,我的表单上有一个 BackgroundWorker,它具有无限 (while(true)) 循环。在此循环
我正在尝试在 .NET 1.1 中实现一个 BackgroundWorker(因为没有任何东西),而且我不太精通线程和委托(delegate)。 现在我有一个名为 BackgroundWorker 的
foreach (string file in listToConvert) { BackgroundWorker backgroundWorker = new BackgroundWorke
我正在制作我的第一个 C# GUI。它使用 BackgroundWorker 来运行计算量大的模拟。模拟会定期报告(通过 ProgressChanged 事件)需要在 GUI 中显示的大量信息。 GU
我想从一个表单启动一个后台 worker 。 private void button2_Click(object sender, EventArgs e) { back
我是一名优秀的程序员,十分优秀!