Silverlight+WCF 实战-网络象棋最终篇之解决重复的消息提示(八)

简介:

前言:

最近有网友经常会问,在跟着做象棋对战的通讯中,在重复退出进入的时候,消息会重复出现,本节就这问题进行解说与优化。

 

一:分析问题产生的原因?

 

1:首先看App.xaml,里面定义了一个全局客户端回调:

public   static  GameService.ServiceClient client; // 回调的客户端

 

并且这个回调我们全局只实例化一次,并且默认加载时定位到登陆页面:

private   void  Application_Startup( object  sender, StartupEventArgs e)
{
   
this .RootVisual  =  root;
   root.Children.Add(
new  Login()); // 默认定位到登录页面。
}

 

2:再看登录页面Login.xaml里,构造函数的初始化:

复制代码
public  Login()
{
            InitializeComponent();
            App.client.LoginCompleted 
+=   new  EventHandler < System.ComponentModel.AsyncCompletedEventArgs > (client_LoginCompleted);
            Load();
}
复制代码

我们对App.client.LoginCompleted初始化了一次事件,这时一切是正常的,接着我们进入房间,之后,我们返回系统回到登陆。

 

3:接着看退出系统的按钮是怎么返回到登陆页面的:

复制代码
         // 退出系统
         private   void  btnLogout_Click( object  sender, RoutedEventArgs e)
        {
            
if  (App.chess.IsGaming)
            {
                btnGameLose_Click(
null null ); // 发送认输
                App.chess.IsGaming  =   false ;
            }
            App.client.OutRoomAsync(App.player, App.player.RoomID, App.player.AttachInfo);
            ((App)Application.Current).RedirectTo(
new  Login());
        }
复制代码

看最后一行,我们又New Login了,这种情况,刚才第二步中的:App.client.LoginCompleted事件将被重复注册,因此,重复的事件注册引发了重复的消息提示。

 

问题总结说明:

对于消息的重复提示,基本都属于事件的重复注册造成的,我们之前的代码很多转向都使用new 控件()的方式在各个页面切换时,于是容易产生这种问题。

 

 

二:解决消息重复问题

 

从第一步中,我们分析到问题产生的根源,于是,我们可以想出很多方式,来解决这种问题,这里我介绍两种方式:

 

先来看一下错误任法:注册事件前加先减,再加,示例代码如下:

App.client.LoginCompleted  -=   new  EventHandler < System.ComponentModel.AsyncCompletedEventArgs > (client_LoginCompleted);
App.client.LoginCompleted 
+=   new  EventHandler < System.ComponentModel.AsyncCompletedEventArgs > (client_LoginCompleted);

网上有人说:每次注册前先去掉一下,然后再增加,逻辑上看起来好像没问题,刚自己试了下,纯忽悠型。

 

现在介绍下我想到的两种方式:

1:定义全局变量List<事件名称>,保存注册过的事件名称

逻辑:在每次事件产生前,先判断一下事件是否存在,不存在则添加,存在则跳过,此方法实现简单,大伙一说就应该会了,所以直接跳过了。

 

2:定义全局变量保存所有房间,于是在RedirectTo切换房间的时候,避免使用New 控件() 来避免再次执行事件注册事件

下面进行代码整改:

A:App.xaml全局定义每个房间的变量,并改造成属性,所幸控件就几个,定义也费不了多少力,代码如下:

复制代码
         private   static  Login loginObj;
        
public   static  Login LoginObj
        {
            
get
            {
                
if  (loginObj  ==   null )
                {
                    loginObj 
=   new  Login();
                }
                
// loginObj.Reset();
                 return  loginObj;
            }
        }
        
private   static  Room roomObj;
        
public   static  Room RoomObj
        {
            
get
            {
                
if  (roomObj  ==   null )
                {
                    roomObj 
=   new  Room();
                }
                
// roomObj.Reset();
                 return  roomObj;
            }
        }
        
private   static  Index indexObj;
        
public   static  Index IndexObj
        {
            
get
            {
                
if  (indexObj  ==   null )
                {
                    indexObj 
=   new  Index();
                }
                
// indexObj.Reset();
                 return  indexObj;
            }
        }
复制代码

 

说明:

这里有两点:1是改造属性方式,这样在调用时不用再写判断语句,2是注册的Reset()方法,后面会开启到。

 

B:查找调用RedirectTo切换界面的代码,替换为:App.xxxxObj

 

随便找个RedirectTo,右键查找所有引用,看看有几个要修改的地方,所幸也不多,如下图:

 

说明:

按上面的查找出来的代码,一个一个更改即可,如把new Index()换成App.IndexObj。

 

 

OK,消息提示重复的问题,至此,是解决了,但是,将产生一点副作用,就是切回去的时候,状态需要重置。

 

简单的示例说明就是:

点登陆时,把按钮设置为不可用,然后你进去,再退出,看到的是“不可用”的按钮就没法再进去了。

 

OK,状态重置的问题,就留到下节解决了。

 

本节没关联啥好看图片,就随便挂一张在下面让大伙欣赏了:

 

最后:谢谢大家对本系列的喜欢,谢谢支持~

同时欢迎大家多到 秋色园 走走~~~

PS:传说点一下推荐会有10个园豆的规则已经取消了,不过,喜欢的还是可以点一下“推荐”,thank you very much!!

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2011/01/05/1926344.html

相关文章
|
11天前
|
SQL 安全 算法
网络安全的盾牌与剑:漏洞防御与加密技术的实战应用
【9月更文挑战第30天】在数字时代的浪潮中,网络安全成为守护信息资产的关键防线。本文深入浅出地探讨了网络安全中的两大核心议题——安全漏洞与加密技术,并辅以实例和代码演示,旨在提升公众的安全意识和技术防护能力。
|
21天前
|
网络协议 Python
告别网络编程迷雾!Python Socket编程基础与实战,让你秒变网络达人!
在网络编程的世界里,Socket编程是连接数据与服务的关键桥梁。对于初学者,这往往是最棘手的部分。本文将用Python带你轻松入门Socket编程,从创建TCP服务器与客户端的基础搭建,到处理并发连接的实战技巧,逐步揭开网络编程的神秘面纱。通过具体的代码示例,我们将掌握Socket的基本概念与操作,让你成为网络编程的高手。无论是简单的数据传输还是复杂的并发处理,Python都能助你一臂之力。希望这篇文章成为你网络编程旅程的良好开端。
39 3
|
22天前
|
机器学习/深度学习 JSON API
HTTP协议实战演练场:Python requests库助你成为网络数据抓取大师
在数据驱动的时代,网络数据抓取对于数据分析、机器学习等至关重要。HTTP协议作为互联网通信的基石,其重要性不言而喻。Python的`requests`库凭借简洁的API和强大的功能,成为网络数据抓取的利器。本文将通过实战演练展示如何使用`requests`库进行数据抓取,包括发送GET/POST请求、处理JSON响应及添加自定义请求头等。首先,请确保已安装`requests`库,可通过`pip install requests`进行安装。接下来,我们将逐一介绍如何利用`requests`库探索网络世界,助你成为数据抓取大师。在实践过程中,务必遵守相关法律法规和网站使用条款,做到技术与道德并重。
32 2
|
29天前
|
数据采集 网络协议 API
HTTP协议大揭秘!Python requests库实战,让网络请求变得简单高效
【9月更文挑战第13天】在数字化时代,互联网成为信息传输的核心平台,HTTP协议作为基石,定义了客户端与服务器间的数据传输规则。直接处理HTTP请求复杂繁琐,但Python的`requests`库提供了一个简洁强大的接口,简化了这一过程。HTTP协议采用请求与响应模式,无状态且结构化设计,使其能灵活处理各种数据交换。
54 8
|
24天前
|
数据采集 API 开发者
🚀告别网络爬虫小白!urllib与requests联手,Python网络请求实战全攻略
在网络的广阔世界里,Python凭借其简洁的语法和强大的库支持,成为开发网络爬虫的首选语言。本文将通过实战案例,带你探索urllib和requests两大神器的魅力。urllib作为Python内置库,虽API稍显繁琐,但有助于理解HTTP请求本质;requests则简化了请求流程,使开发者更专注于业务逻辑。从基本的网页内容抓取到处理Cookies与Session,我们将逐一剖析,助你从爬虫新手成长为高手。
48 1
|
23天前
|
Python
HTTP协议不再是迷!Python网络请求实战,带你走进网络世界的奥秘
本文介绍了HTTP协议,它是互联网信息传递的核心。作为客户端与服务器通信的基础,HTTP请求包括请求行、头和体三部分。通过Python的`requests`库,我们可以轻松实现HTTP请求。本文将指导你安装`requests`库,并通过实战示例演示如何发送GET和POST请求。无论你是想获取网页内容还是提交表单数据,都能通过简单的代码实现。希望本文能帮助你在Python网络请求的道路上迈出坚实的一步。
36 0
|
1月前
|
SQL 安全 网络安全
网络安全之盾:漏洞防御与加密技术的实战应用
【9月更文挑战第2天】在数字时代的浪潮中,网络安全成为保护个人隐私和企业资产的坚固盾牌。本文深入探讨了网络安全的两个核心要素:防御漏洞和加密技术。我们将从基础概念入手,逐步剖析常见的网络攻击手段,并分享如何通过实践加强安全意识。同时,提供代码示例以增强理解,旨在为读者构建一道坚不可摧的网络安全防线。
|
4天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益严重。本文将从网络安全漏洞、加密技术和安全意识三个方面,探讨如何保护个人信息和网络安全。我们将通过实例分析,了解网络攻击者如何利用安全漏洞进行攻击,以及如何运用加密技术防止数据泄露。同时,我们还将讨论提高个人和企业的安全意识的重要性。
|
2天前
|
存储 安全 网络安全
云计算与网络安全:云服务、网络安全、信息安全的技术探讨
在当今数字化时代,云计算和网络安全已成为企业和个人用户不可或缺的技术。本文将深入探讨云计算的基本概念、云服务类型、网络安全的重要性、信息安全的关键要素以及如何确保数据安全。通过分析这些技术领域的发展趋势和挑战,我们将为读者提供关于如何在云环境中保护数据安全的实用建议。
|
1天前
|
SQL 安全 网络安全
网络安全与信息安全的现代挑战:从漏洞到加密技术
在数字化时代,网络安全和信息安全成为维护数据完整性、保密性和可用性的关键。本文将探讨网络安全中的常见漏洞,介绍加密技术如何增强安全,并强调培养良好安全意识的重要性。我们还将通过代码示例,展示如何在实际环境中应用这些概念以保护系统免受潜在威胁。
12 6

热门文章

最新文章