问题背景:客户端是PDA,当客户端开机时,PDA自动检测网络是否通,先检测Internet是否通,如果不通则检测蓝牙,GPRS,红外等其他网络通讯。如果都不通,则提示用户“正在试图建立连接,请稍候!”,这样每隔10秒则自动检测一次网络是否通。就象QQ,如果连接断开,程序能一直测试,直到连接正常.问题: 我参考这段话" 如果应用程序使用XML WEB 服务,当网络连接可用时,程序需要连接到该服务,上传修改的数据或下载数据到设备上。在应用程序中,应当使用 WebResponse 类编写一个方法,向XML WEB服务所在的服务器上的一个有效的URL发出一个 http get 请求。如果响应中的HttpWebResponse.StatusCode属性等于HttpStatusCode.ok ,则到服务器的连接确认。开发人员应当每隔一段时间从一个System.Threading.Timer实例的TimerEvent 调用这个方法,轮询服务器。当此方法成功时, 应用程序知道她已经与服务器建立了成功的HTTP连接,因此可以进行与XML WEB服务的交互,或者访问其他网络资源." 写了如下代码 ,但是监测不成功 进入死循环. 帮我看看 有没有好的方法??
先谢谢了~~!代码:private void btnConnect_Click(object sender, System.EventArgs e)
{
//连接网络(Internet,红外线,蓝牙,Gprs等)
Connect();
}
private void Connect()
{
   //监测Internet 是否连通
ConnectInternet();
}private void ConnectInternet()
{
    HttpWebResponse result = null;
    try
    {

System.Uri server=new Uri("http://www.sohu.com");
WebRequest req = WebRequest.Create(server);
result = (HttpWebResponse)req.GetResponse();
if (result.StatusCode == HttpStatusCode.OK )
{
//调用 web server mothed
this.label1.Text = "你好!网络连通!";
}
     }
     catch(Exception ex)
     {
this.lblMessage.Text = "正在连接,请稍候...";
ReLookForServer();
     }
}/// <summary>
/// 轮询服务器
/// </summary>
private void ReLookForServer()
{

    TimerState s = new TimerState();
    TimerCallback timerDelegate = new TimerCallback(CheckStatus);
   System.Threading.Timer timer = new System.Threading.Timer(timerDelegate, s,1000, 1000);
   s.tmr = timer;
   while(s.tmr != null)
   Thread.Sleep(0);
}/// <summary>
/// 时间轮询状态信息类
/// </summary>
class TimerState 
{
public int counter = 0;
public System.Threading.Timer tmr;
}
/// <summary>
/// 时间轮询状态信息,只自动监测10次,如果超出10次以上视为不能连接成功!
/// </summary>
/// <param name="state"></param>
private void CheckStatus( Object state)
{
TimerState s =(TimerState)state;
s.counter++;
if(s.counter <=10)
    ConnectInternet();
else
{
    this.label1.Text = "";
    this.label1.Text = "对不起,网络不通!";
    s.tmr.Dispose();
    s.tmr = null;

}
}

解决方案 »

  1.   

    两个地方有点不妥
    1。private void ConnectInternet()中对ReLookForServer();的调用最好不要放在catch里面,因为这与异常没关系,放在if的else里面比较好一些
    2。private void CheckStatus( Object state)中s.tmr.Dispose();不能在这里用,因为class TimerState 中的tmr本来就是一个引用类型的成员,在此处s.tmr跟private void ReLookForServer()
    中的timer指向的是同一对象,此处不能Dispose
      

  2.   

    ljb198102(白云)  :谢谢你回答但是ReLookForServer()只能放到catch才能捕获到的 因为执行WebRequest req = WebRequest.Create(server); 后没有可连接的就发生异常了帮我解决下 每过10秒就 自动监测网络一次的实现  谢谢~!
    CheckStatus方法好像是另一个线程 老是蹦来蹦去的