当我使用 F11 debug时,NetStatus
值为true
,但当我使用 F5 debug时,NetStatus
值为false
。为什么?我该如何解决?
我不知道_connect
值的变化时间。
这是一个多线程同步问题吗?
namespace conn
{
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
class Program
{
static void Main(string[] args)
{
wait_conn();
}
private static void wait_conn()
{
bool NetStatus = false;
string DataS = "127.0.0.1";
CheckIpConn conn = new CheckIpConn();
conn.CheckIp(DataS);
//Thread.Sleep(3000);
NetStatus = conn.Connected;
if (!NetStatus)
Console.WriteLine(conn.Connected.ToString());
Console.Read();
}
}
public class CheckIpConn
{
private int _port = 135;
private volatile bool _connect;
private IPEndPoint _iPEndPoint;
private TcpClient _client;
private TimerCallback _timerCallBack;
private System.Threading.Timer _timer;
public bool Connected
{
get { return _connect; }
}
public void CheckIp(string Ip)
{
_iPEndPoint = new IPEndPoint(IPAddress.Parse(Ip), _port);
_timerCallBack = new TimerCallback(CheckConnect);
_timer = new System.Threading.Timer(_timerCallBack, null, 10, 1000);
_timer.Dispose();
}
public void CheckConnect(object o)
{
try
{
_client = new TcpClient();
_client.Connect(_iPEndPoint);
_connect = true;
_client.Close();
}
catch
{
_connect = false;
}
}
}
}
答案 0 :(得分:1)
您的代码非常不清楚 - 看起来您正在尝试异步执行操作,但这样做非常糟糕。例如,您正在创建Timer
,然后立即处理它。
当在调试器中逐行步进时,这可能有效 - 因为计时器可能会在Dispose
调用之前触发...但是当你刚运行代码时,你就会先处理掉定时器它有机会开火。此外,您在调用conn.Connected
后立即使用CheckIp
的值 - 因此,如果计时器发生了,则可能是在您检查了该值之后。
我强烈建议您同步进行检查。让它工作,然后考虑异步方法。
答案 1 :(得分:0)
你创建了一个在线程池上执行一个函数的计时器 - 所以当你CheckIP
返回计时器回调时,你真的没有太多的保证。
此外:为什么在创建计时器后立即丢弃计时器?虽然MSDN表示在处理之后可能会发生回调,因为回调已排队,但这肯定是一种糟糕的风格。这也意味着你只需要检查一次 - 所以你也可以同时进行检查 - 特别是wait_conn
表示它应该等到建立连接。
另外:TcpClient
是一次性的,所以你应该这样做:
using (var client = new TcpClient())
{
client.Connect(_iPEndPoint);
_connect = true;
client.Close();
}
如果你不对它做任何事情,那么在课堂上有一个成员变量没有意义。