C#TimerCallback返回值错误
当我使用F11调试时,C#TimerCallback返回值错误,c#,C#,当我使用F11调试时,NetStatus值为true,但当我使用F5调试时,NetStatus值为false。为什么?我怎么修理它 我不知道\u connect值何时更改。 这是多线程同步问题吗 namespace conn { using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets;
NetStatus
值为true
,但当我使用F5调试时,NetStatus
值为false
。为什么?我怎么修理它
我不知道\u 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;
}
}
}
}
您的代码非常不清楚-看起来您正在尝试异步执行操作,但执行得非常糟糕。例如,您正在创建一个计时器
,然后立即处理它
在调试器中逐行执行时,这可能会起作用-因为计时器可能会在Dispose
调用之前触发。。。但是,当你刚刚运行代码时,你就在计时器有机会触发之前处理掉了它。此外,您在调用CheckIp
后立即使用conn.Connected
的值-因此,如果计时器确实启动,则可能是在您检查了该值之后
我强烈建议您同步进行检查。得到一个异步方法。 你创建一个在线程池上执行函数的计时器-所以你真的没有太多的保证,当<代码> CHECKIP返回时,定时器回调已经被执行。 此外:为什么在创建计时器后立即将其丢弃?虽然声明回调可以在dispose之后发生,因为回调已排队,但这肯定是一种糟糕的样式。这也意味着您只需要检查一次-因此您最好同步进行检查-尤其是
wait\u conn
指示它应该等到建立了连接
另外:TcpClient
是一次性的,因此您应该:
using (var client = new TcpClient())
{
client.Connect(_iPEndPoint);
_connect = true;
client.Close();
}
如果您不使用成员变量,那么在类中使用成员变量是没有意义的。我明白了!我添加线程。睡眠(300);连接前,增加线程睡眠(2000);在_timer.Dispose()之前;现在,这是工作!谢谢你@弗林恩:但这不是一个好的解决办法。这基本上是一种缓慢且不可靠的连接检查方法。。。正如我所说的,我强烈建议使用同步方法,除非您真的想正确地使用异步方法。在代码中添加
Sleep
调用并不是获得可靠系统的好方法。我是C#初学者。我想在连接到目标主机的SQL端口之前检查其网络状态。否则,当SQL SERVER关闭时,用户将等待20-30秒。@flyingnn:但您正在连接到该端口-几秒钟后您就放弃了。public void CheckConnect(对象o)?这只是一个测试连接。如果NetStatus值为true,则将执行SQL连接。