【发布时间】:2014-09-17 06:43:03
【问题描述】:
在设置我的套接字进行连接时,我将方法包装在一个 try-catch 块中..
如果引发套接字异常,我会创建一个新线程.. 休眠 15 秒.. 然后再次调用 connect 方法,但这次是从另一个线程调用。我这样做主要是为了睡眠方法(以避免使用计时器重新连接)不挂断主线程。
无论如何.. 尝试连接时,我使用一种名为 Write() 的方法将状态写入文本框,该方法只是将文本附加到当前文本,并在其前添加一个 \n...
因为在连接失败时我创建了一个单独的线程来调用连接方法(它确实修改了表单上的控件),所以我在方法调用上使用调用是正确的吗?
这是我的代码
private void Connect()
{
try
{
Write("Connecting...");
_ClientSocket.Connect(new IPEndPoint(IPAddress.Loopback, 2500));
Connected = true;
Write("Connected.");
_ClientSocket.BeginReceive(Buffer, 0, Buffer.Length, 0, new AsyncCallback(RecieveCallBack), null);
}
catch (SocketException ex)
{
Write("Connection Failed. Trying again in 15 Seconds...");
Connected = false;
new Thread(delegate()
{
Thread.Sleep(15000);
Invoke((MethodInvoker)delegate
{
this.Connect();
});
}).Start();
}
catch (Exception ex)
{
}
}
我只是想确保我以正确的方式执行此操作
【问题讨论】:
-
测试应该回答你的问题。没有调用它可以工作吗?它适用于调用吗?如果答案分别为“否”和“是”,那么您似乎做了正确的事情。如果答案是肯定的,那么你不需要调用。
-
你的 UI 框架是什么?我很确定这种做事方式是错误的,尤其是在 C# 5.0 世界中
-
我看不到您访问 WinForms 的位置。也不要手动创建线程。使用例如 ThreadPool.QueueUserWorkItem
-
这是个坏主意。除了忘记使用 BeginInvoke() 之外,您还可以通过假设在 Connect() 调用之后连接套接字来创建其他错误。所以咬紧牙关,总是开始一个线程。现在一切都很明显,包括问题的答案。
-
@HansPassant 所以你建议不要在主线程中连接并总是在单独的线程中连接?
标签: c# multithreading winforms sockets exception-handling