从现在起,我是异步编码的初学者,在这个例子中,我无法看到我能做些什么。
我有两个项目,一个有与某个服务进行通信的类,另一个是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);
}
}
}
答案 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);
}
}