全部,我正在编写一个需要与服务器建立异步阻塞连接的应用程序。我有一个带有按钮的 GUI 表单和一个与 BeginConnect/EndConnect 对执行连接的类。该实现遵循此MSDN 示例。
但是,在回调方法中抛出了异常。这是我试图避免的。我想要的是检查连接是否已经建立,以及它是否没有将适当的错误作为我的 GUI 表单上的文本吐出。
我试图检查 BeginConnect() 的返回值,但它在调用静态方法之前返回。当我建立连接(按钮单击事件)时,我试图重新抛出异常并捕获它,但它不起作用。异常没有被捕获。
如何检查是否已建立连接?
我可能可以将我的文本控件传递给连接类,并在捕获异常时将文本设置为错误,但是还有其他方法吗?
谢谢你。
[编辑]
class InternetConnector
{
public void ConnectToHost()
{
IPEndPoint ip = new IPEndPoint(IPAddress.Parse(connector_host), connector_port);
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Blocking = true;
client.BeginConnect(ip, new AsyncCallback(ConnectCallback), client);
}
private static void ConnectCallback(IAsyncResult ar)
{
try
{
Socket sock = (Socket)ar.AsyncState;
sock.EndConnect(ar);
connectDone.Set();
Connected = true;
}
catch (Exception e)
{
throw (e);
}
}
}
public partial class Form1 : Form
{
private bool isRunning = false;
private InternetConnector client = new InternetConnector();
private void startStop_Click(object sender, EventArgs e)
{
try
{
if (!isRunning || !InternetConnector.Connected)
{
if (!InternetConnector.Connected)
{
client.SetAddress(ipAddress.Text);
client.SetPort(Convert.ToInt32(connectionport.Text));
client.ConnectToHost();
status.Text = "Signals Receiver: Connected";
status.ForeColor = Color.Green;
startStop.Text = "Stop";
isRunning = true;
}
else
{
startStop.Text = "Start";
client.DisconnectFromHost();
isRunning = false;
}
}
}
catch(Exception ex)
{
status.Text = "Socket Error: " + ex.Message;
}
}
}
如果我使用“throw(e);” 在回调中捕获块异常未在单击侦听器中捕获。但是回调中需要 try/catch,因为错误的连接会抛出异常而不返回错误。