NetStatus变量的值,按理应该是true才对的,为什么执行起来,总是false,可是F11调试时,也有时是true的,不明白这是为什么,多线程的问题吗?怎么解决呢?代码如下:using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace TestConnSql
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            wait_conn();        }
        private void wait_conn()        {
            bool NetStatus, net = false;
            string DataS = "192.168.160.1";
            int ty;            CheckIpConn conn = new CheckIpConn();
            ty = conn.TT;
            //net = conn.Connected;            conn.CheckIp(DataS);            //Thread.Sleep(2000);            ty = conn.TT;
            NetStatus = conn.Connected;            //net = CheckIpConn.CheckIp(DataS);            // MessageBox.Show(net.ToString());            //conn.setvalue();
            NetStatus = conn.Connected;            if (!NetStatus)
                MessageBox.Show(conn.Connected.ToString() + ty.ToString());
        }
    }
}using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;
using System.Windows.Forms;namespace TestConnSql
{
    public class CheckIpConn
    {
        private int _port = 1433;
        private volatile bool _connect;
        private IPEndPoint _iPEndPoint;
        private TcpClient _client;
        private TimerCallback _timerCallBack;
        private System.Threading.Timer _timer;
        private int tt = 5;        public int TT
        {
            get { return tt; }
        }        public int Port
        {
            get { return _port; }
            set { _port = value; }
        }
        public bool Connected
        {
            get { return _connect; }
        }        public void setvalue()
        {
            _connect = true;
        }        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;
                this._connect = true;
                tt = 50;
                //MessageBox.Show("cc" + _connect);
                _client.Close();
            }
            catch
            {
                _connect = false;
               //MessageBox.Show("cc" + _connect);            }
        }
    }
}

解决方案 »

  1.   

    应该是异步的吧,能不能等这个方法 CheckConnect执行完,再执行一下步呢?
      

  2.   

    你这里不需要使用Timer直接调用就好了,这个时候就是同步阻塞的
      

  3.   

    不用Timer?
    我是想让 CheckConnect 尽快返回结果。
    如果直接调用,当目标连接不上时,会等上一些时间,不想这样。
      

  4.   

    那就把//Thread.Sleep(2000);解注Thread.Sleep(3000);
      

  5.   

    Thread.Sleep(3000) 也是不行。F11调试是可以的,F5就不行了。
      

  6.   

    conn.Connected 的值是不确定的,加线程休眠 意思是等3秒,3秒之后获取结果 能否连上是不确定的。
      

  7.   

    我就是让它连上一个确定的,conn.Connected的值,期望的是TRUE,可是就不是这样。
      

  8.   

    我在单步调试时,没用到Thread.Sleep(3000),连接状态是连上的,
    执行完这一句, conn.CheckIp(DataS);
    conn.Connected的值就是TRUE。
      

  9.   

    我现在是让它运行在可以正常连接的状态,正常情况下,应该是没有对话框弹出的,但是现在有,按F5的话,按F11则没有。
    加与不加Thread.Sleep(3000),好像没什么意义。
      

  10.   

    我就是不明白在这个例子里的多线程是怎么回事,
    _timer = new System.Threading.Timer(_timerCallBack, null, 10, 1000);这句话不是说等10毫秒后执行CheckConnect,执行完CheckConnect,_connect=true。把这句 Thread.Sleep(2000);设为多大也没用啊,我一直在试。
      

  11.   

    _timer = new System.Threading.Timer(_timerCallBack, null, 10, 1000);这句话是 过10毫秒以后开始执行 _timerCallBack,执行结束后间隔 1秒重新执行.改成_timer = new System.Threading.Timer(_timerCallBack, null, 10, 0);
      

  12.   

    明白怎么回事了,一个老外说得好清楚:
    http://stackoverflow.com/questions/8098301/c-sharp-timercallback-return-value-error
      

  13.   

    修改后的同类代码:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;namespace conn
    {
            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(300);                        NetStatus = conn.Connected;                        if (!NetStatus)
                                    Console.WriteLine(conn.Connected.ToString());
                            else
                                    Console.WriteLine("OK!");
                            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, 0, 1000);
                            Thread.Sleep(2000);
                            _timer.Dispose();                }                public void CheckConnect(object o)
                    {
                            try
                            {
                                    _client = new TcpClient();
                                    _client.Connect(_iPEndPoint);
                                    _connect = true;
                                    _client.Close();
                            }
                            catch
                            {
                                    _connect = false;
                            }
                    }
            }
    }
      

  14.   

    我一开始是假定你了解多线程的,因为你的代码里是开启了2个线程.所以,我告诉你 conn.Connected 的值是不确定的,两个任务并行.不通信的情况,就是不确定的.可是后来我才发现 你不知道你的代码做了什么事我觉得你没理解任务并行,以及当前"环境"