如何检查线程中是否有tcp端口?我尝试使用后台工作线程,但它工作正常,但更新速度相当慢。我想向我的UI线程报告进度。这是正确的方法吗?
BackgroundWorker authStatus = new BackgroundWorker {WorkerReportsProgress = true};
authStatus.DoWork += AuthStatusWork;
authStatus.ProgressChanged += AuthStatusProgressChanged;
public void AuthStatusWork(object sender, EventArgs e)
{
var thread = sender as BackgroundWorker;
using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
socket.SendTimeout = 3;
while (true)
{
try
{
socket.Connect(auth[0], Convert.ToInt32(auth[1]));
if (thread != null) thread.ReportProgress(1);
}
catch (SocketException ex)
{
if (ex.SocketErrorCode != SocketError.ConnectionRefused &&
ex.SocketErrorCode != SocketError.TimedOut) continue;
if (thread != null) thread.ReportProgress(0);
}
}
}
}
public void AuthStatusProgressChanged(object sender, ProgressChangedEventArgs e)
{
switch (e.ProgressPercentage)
{
case 0:
AuthStatus.Foreground = Brushes.Red;
AuthStatus.Content = "Offline";
break;
case 1:
AuthStatus.Foreground = Brushes.Green;
AuthStatus.Content = "Online";
break;
}
}
答案 0 :(得分:2)
使用异步连接,如here
所示这将允许您尝试连接到任意数量的远程TCP端口,并在成功或失败时通知您。您不必担心已经启动或耗尽了多少线程资源(除了套接字,无论采用何种方法,这都是一个问题)。
答案 1 :(得分:0)
我正在尝试检查远程服务器的端口,看它是否可以连接。
所以尝试连接它。这些试图以某种方式预测未来的游戏毫无意义。尝试连接并处理错误。这适用于任何资源:查看是否有任何资源可用的最佳方法是尝试使用它。