今天遇到一个问题,当网络连接有问题的时候设计软件向用户发送通知,查了资料发现了两个相关的事件分享一下。

一、System.Net.NetworkInformation命名空间下的NetworkChange类中定义的NetworkAddressChanged事件:

  此事件的官方摘要是:在网络接口的 IP 地址更改时发生。

  在网络发生变化是会触发,并且不知道为什么在断网或者连网时分别会触发两次,如果知道原因的大神请留言告知,实例代码:

   NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(AddressChangedCallback);

   private void AddressChangedCallback(object sender, EventArgs e)
        {
            NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
            foreach (NetworkInterface n in adapters)//查看网络适配器的状态
            {
                MessageBox.Show(n.Name + "  is  " + n.OperationalStatus);
            }
            if (CheckNetworkStatus() == false)
            {
                MessageBox.Show("与服务器网络断开");
            }
        }
        private bool CheckNetworkStatus()//检测网络是否断开
        {
            bool networkFlag = false;
            try
            {
                Ping p = new Ping();
                PingOptions pOption = new PingOptions();
                pOption.DontFragment = true;
                string data = "Test Data!";
                byte[] buffer = Encoding.ASCII.GetBytes(data);
                int timeout = 500; // Timeout         
                string ip = "www.baidu.com";
                System.Net.NetworkInformation.PingReply reply = p.Send(ip, timeout, buffer, pOption);
                if (reply.Status == System.Net.NetworkInformation.IPStatus.Success)
                {
                    networkFlag = true;
                }
            }
            catch (Exception ex)
            {
                //ex.Message=Ping 请求期间发生异常
                networkFlag = false;
            }
            return networkFlag;
        }

二、System.Net.NetworkInformation命名空间下的NetworkChange类中定义的NetworkAvailabilityChanged事件:

  此事件的官方摘要是:在网络的可用性更改时发生。

  在网络可用性发生变化是会触发,在我的客户端中使用了这个事件监听网络可用性的变化,实例代码:

   NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(AvailabilityChangedCallback);

   public delegate void MyMethodP(object obj);//定义一个委托用于线程间的消息传递

   private void AvailabilityChangedCallback(object sender, EventArgs e)
        {
            MyMethodP mm = new MyMethodP(MessageBoxShow);
            if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())//检测当前网络是否可用
            {//断网处理
                this.Invoke(mm, "系统检测当前网络断开,请重新登录!");
                Application.Exit();
            }
            else
            {
                this.Invoke(mm, "检测到您当前网络不稳定,连接已断开,请重新登录!");
                Application.Exit();
            }
        }
        private void MessageBoxShow(object obj)//消息传递方法
        {
            MessageBox.Show(this, obj.ToString());
        }

C#与网络相关的两个监听的事件的更多相关文章

  1. 两种js监听滚轮事件的方式

    前段时间在写前端的时候,需要监听浏览器的滚轮事件 网上查了一下,找到两种监听滚轮事件的方法: 一.原生js通过window.onscroll监听 //window.onscroll = functio ...

  2. Oracle启动两个监听

    接上篇:Oracle服务器修改IP后 Oracle服务器更换IP后,办公网络里面可以正常访问了,外地的同事,连了vpn 也可以访问,以为可以收工回家,突然又有同事过来说,机房的服务器ping不通新的i ...

  3. 【ERROR】Oracle11g两个监听同名进程的故障

    问题: 一个实例启动了另个两个监听. 解决方法: #ps -ef | grep tnslsnr #oracle 925826 1 0 Apr 06 - 234:50 /u01/app/oracle/p ...

  4. JS 中的事件绑定、事件监听、事件委托

    事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有 ...

  5. javascript事件监听与事件委托

      事件监听与事件委托 在js中,常用到element.addEventListener()来进行事件的监听.但是当页面中存在大量需要绑定事件的元素时,这种方式可能会带来性能影响.此时,我们可以用事件 ...

  6. 在Javascript中监听flash事件(转)

    在Javascript中监听flash事件,其实有两种做法: 1.在特定的环境下(例如专门制作的flash),大家约定一个全局函数,然后在flash的事件中用ExternalInterface.cal ...

  7. Vue 爬坑之路(七)—— 监听滚动事件 实现动态锚点

    前几天做项目的时候,需要实现一个动态锚点的效果 如果是传统项目,这个效果就非常简单.但是放到 Vue 中,就有两大难题: 1. 在没有 jQuery 的 animate() 方法的情况下,如何实现平滑 ...

  8. H5_0003:JS禁用调试,禁用右键,监听F12事件的方法

    1,禁用调试 // 这个方法是防止恶意调试的 (function () { console["log"]("=============================== ...

  9. JS 事件绑定、事件监听、事件委托详细介绍

    原:http://www.jb51.net/article/93752.htm 在JavaScript的学习中,我们经常会遇到JavaScript的事件机制,例如,事件绑定.事件监听.事件委托(事件代 ...

随机推荐

  1. 解决只能通过localhost访问Elasticsearch的问题

    解决只能通过localhost访问Elasticsearch的问题   在默认情况下Elasticsearch是无法通过外网访问的 需要绑定地址,原因如下:   具体方法为: vim /opt/es/ ...

  2. java 包装类的使用

    1.为什么要有包装类(或封装类) 为了使基本数据类型的变量具有类的特征,引入包装类. 2.基本数据类型与对应的包装类: 3.需要掌握的类型间的转换:(基本数据类型.包装类.String) 应用场景举例 ...

  3. C++快速读写

    1.主函数的最前面加入这个 std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); 2.这是一个读入数字的快读 inline int read() ...

  4. 攻防世界FlatScience

    访问robots.txt发现 admin.php和login.php 在admin.php和login.php分别尝试注入 发现login.php页面存在注入,并且根据报错得知数据库类型为sqlite ...

  5. flask 源码专题(三):请求上下文和应用上下文入栈与出栈

    1.请求上下文和应用上下文入栈 # 将ctx入栈,但是内部也将应用上下文入栈 ctx.push() def push(self): # 获取到的 top == ctx top = _request_c ...

  6. Python函数07/有参装饰器/多个装饰器装饰一个函数

    Python函数07/有参装饰器/多个装饰器装饰一个函数 目录 Python函数07/有参装饰器/多个装饰器装饰一个函数 内容大纲 1.有参装饰器 2.多个装饰器装饰一个函数 3.今日总结 3.今日练 ...

  7. 数据清洗与准备知识图谱-《利用Python进行数据分析》

    所有内容整理自<利用Python进行数据分析>,使用MindMaster Pro 7.3制作,emmx格式,源文件已经上传Github,需要的同学转左上角自行下载或者右击保存图片.

  8. vue 集成html5 plus

    首先要安装一个包 vue-html5plus npm i vue-html5plus -S 然后配置这个文件 在main.js添加一串代码 var onPlusReady = function (ca ...

  9. Spring的学习与实战(续)

    @ 目录 背景 JavaMailSender Spring集成邮件发送功能 1. 添加maven依赖 2. 添加Spring邮件配置 3. 创建邮件管理Bean并注入Spring应用上下文 4. 修改 ...

  10. bzoj3446[Usaco2014 Feb]Cow Decathlon*

    bzoj3446[Usaco2014 Feb]Cow Decathlon 题意: FJ有n头奶牛.FJ提供n种不同的技能供奶牛们学习,每头奶牛只能学习一门技能,每门技能都要有奶牛学习. 第i头奶牛学习 ...