如何在构造函数中捕获异步方法的异常?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在构造函数中捕获异步方法的异常?相关的知识,希望对你有一定的参考价值。

我有一个Winforms程序,以下是构造函数,它创建一个计时器来限制昂贵的异步调用。

public partial class Form1: Form
{
    public Form1()
    {
        _timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
        _timer.Tick += (s, e) =>
        {
            _flag = false;
            _timer.Stop();
            try
            {
                Task.Run(async () => await Presenter.Search()); // Call async DB calls
            }
            catch (Exception ex) // Cannot capture the Exception of `Presenter.Search()`
            {
                MessageLabel.Text = "Error:....";
            }
        };
    }

    private readonly DispatcherTimer _timer;
    private bool _flag;

click事件会触发异步调用

public void OnCheckedChanged(object sender, EventArgs e)
{
    if (!_flag)
    {
        _flag = true;
        _timer.Start();
    }
}

如何捕获Presenter.Search()的异常并在表单中显示错误?

如果我改变它会阻止UI线程吗?

Task.Run(async () => await Presenter.Search());

Presenter.Search().RunSynchronously()

?

答案

要处理Presenter.Search的异常,只需为Tick事件使用异步事件处理程序。

_timer.Tick += async (s, e) =>
{
    _flag = false;
    _timer.Stop();
    try
    {
        await Presenter.Search(); // Call async DB calls
    }
    catch (Exception ex) // Cannot capture the Exception of `Presenter.Search()`
    {
        MessageLabel.Text = "Error:....";
    }
};

以上是关于如何在构造函数中捕获异步方法的异常?的主要内容,如果未能解决你的问题,请参考以下文章

未使用 await 调用时在异步方法中捕获异常

令人惊讶的情况,异步方法中的异常处理不会捕获异常

来自异步方法的 Mvc .Net 捕获异常

如何打印 C++ 中捕获的异常的堆栈跟踪和 C++ 中的代码注入

为啥我无法在具有 void 返回类型的异步函数中捕获异常?

使用 final 成员处理构造函数中捕获的 Java 异常