すべて、サーバーへの非同期ブロッキング接続が必要なアプリケーションを作成しています。ボタンとBeginConnect/EndConnectペアとの接続を実行するクラスを備えたGUIフォームがあります。実装は、この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);」を使用すると コールバックのcatchブロック例外は、クリックリスナーでキャッチされません。ただし、接続障害が例外をスローし、エラーを返さないため、コールバックでtry/catchが必要です。