处理C#中异步方法中发生的异常

时间:2014-03-21 20:47:27

标签: c# winforms asynchronous exception-handling

从现在起,我是异步编码的初学者,在这个例子中,我无法看到我能做些什么。

我有两个项目,一个有与某个服务进行通信的类,另一个是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);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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);
    }
}