C#TimerCallback返回值错误

时间:2011-11-11 18:25:36

标签: c#

当我使用 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;
            }
        }
    }
}

2 个答案:

答案 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();
}

如果你不对它做任何事情,那么在课堂上有一个成员变量没有意义。