Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#TimerCallback返回值错误_C# - Fatal编程技术网

C#TimerCallback返回值错误

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;

当我使用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;
    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连接。