【问题标题】:Handle a exception that happens in a asynchronous method in C#处理 C# 中异步方法中发生的异常
【发布时间】:2014-03-21 20:47:27
【问题描述】:

从现在开始我是异步编码的初学者,我只是看不出在这个例子中我能做什么。

我有两个项目,一个有与某个服务通信的类,另一个是 WinForms 项目。

所以我在另一个项目的 WinForms 中有一个引用,它允许我创建 Client 对象的实例以按照我的意愿使用它。

问题是,因此,我无法使用 System.Windows.Forms.MessageBox。

然后,我会在 Form 类中使用 try...catch,但是... 现在的问题是我无法获取异常,系统只是不抓取它并继续执行直到应用程序本身崩溃。

所以,这是我的小项目,其中包含用于包装连接到服务器的逻辑的类。

(ps.:当我指的是项目时,我的意思是我在 Visual Studio 2013 中有一个解决方案,其中包含两个项目,一个类库和一个 Win Forms 应用程序)

public class Client
{
    public Client(string host, int port)
    {
        Host = host;
        Porta = port;

        Client = new TcpClient();

        Connect();
    }

    public string Host { get; set; }
    public int Port { get; set; }

    public TcpClient Client { get; set; }

    private async void Connect()
    {
        await Client.ConnectAsync(Host, Port);
    }
}

这是另一个带有主窗体的项目。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            Client client = new Client("localhost", 8080);
        }
        catch (SocketException socketException)
        {
            MessageBox.Show(socketException.Message);
        }
    }
}

【问题讨论】:

    标签: c# winforms asynchronous exception-handling


    【解决方案1】:

    避免使用async void。您无法捕获从async void 方法抛出的异常。

    public async Task ConnectAsync()
    {
        await Client.ConnectAsync(Host, Port);
    }
    
    private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            Client client = new Client("localhost", 8080);
            await client.ConnectAsync();
        }
        catch (SocketException socketException)
        {
            MessageBox.Show(socketException.Message);
        }
    }
    

    【讨论】:

    • 我明白了,尝试在构造函数中强制使用异步方法是我的错误。我不应该那样做。
    【解决方案2】:

    过去,我总是使用一个通用对象来保存我想从客户端获取到服务器的任何内容,但也有一个违规列表属性和一个布尔成功属性。

    如果我在服务器上遇到异常,我将成功设置为 false 并将错误消息放入违规列表中。如果您需要更多详细信息,请将异常本身放入列表中。然后在客户端上检查我的通话是否成功。如果是这样,那太好了,获取我需要的数据。否则打印违规列表中的错误。

    【讨论】:

      猜你喜欢
      • 2014-04-02
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      相关资源
      最近更新 更多