zoukankan      html  css  js  c++  java
  • Smobiler与Windows的异步回调差别

    Smobiler与Windows的异步回调差别——基于.NET的APP开发和Windows开发差别

    基于.NET的APP开发和Windows开发,异步回调差别

    Windows app开发 异步回调 Smobiler 示例

    在Smobiler的开发中,控件或组件及客户端功能都是通过事件或委托来进行处理的。

    Smobiler是基于异步非阻塞的方式来运行的

    下面我们分别对Windows的和Smobiler的MessageBox的处理方法来举例说明。

    Windows的MessageBox方法

    l 开发过Windows的都比较熟悉MessageBox,在MessageBox.Show后面可以直接对选择的值进行判断并后续处理,如下的代码

    if (System.Windows.Forms.MessageBox.Show("MessageBox", "Yes/No", MessageBoxButtons.YesNo) == DialogResult.Yes)

    {

    }

    MessageBox.Show("After MessageBox");

    l 上面的代码在电脑上会先弹出MessageBox,点击是或否后,会再弹出After MessageBox,如下图

    clip_image002

    Smobiler的MessageBox方法

    l 但是在Smobiler中,MessageBox.Show方法是void的,就代表是没有返回值的。那么怎么获取MessageBox选中的值呢?我们先看如下的代码。

    MessageBox.Show("异步说明示例", "显示一个是和否的对话框", MessageBoxButtons.YesNo);

    Toast("客户端点击的结果是?");

    l 上面的代码打开Smobiler客户端连接并测试后,会发现,出现“异步说明示例”的对话框的同时,也会出现一个“客户端点击的结果是?”的提示。如下的显示。

    Smobiler与Winform的对话框差异

    l 这是为什么呢?我们下面会说明

    n Windows的代码运行在Windows操作系统中,是单机的,它是基于UI线程阻塞的,在弹出提示框时,在你没有在界面上点击时,它当前的UI线程是处于等待状态,直到你界面上点击提示框后,这个线程才会恢复,后面的代码也才接着执行。如下图所示例。

    clip_image004

    n Smobiler分别有客户端和服务端,服务端上需要客户端显示MessageBox时,需要先告诉客户端要显示,客户端上用户点击后再向服务端发送点击事件,服务端调用代码,其实Smobiler也可以做成线程阻塞的方式,但是Smobiler服务端不像Windows桌面程序一样只有一个UI线程,它还包含了所有的客户端,如果使用了UI线程阻塞,那么每一个客户端都需要有一个阻塞线程,这对Smobiler服务端的运行会造成很大的性能问题(即服务端需要维持线程一直处于等待状态)。所以Smobiler在设计之初,就使用了异步非阻塞的方式。

    Smobiler的异步非阻塞方式

    l 基于上面的代码进行优化,让它先弹出在弹出SmoMessageBox,再选择完成后再弹出After MessageBox,效果如下面的动图。

    MessageBox.Show("异步说明示例", "显示一个是和否的对话框", MessageBoxButtons.YesNo, (obj, args) =>

    {

    Toast("客户端点击的结果是" + args.Result.ToString());

    });

    Toast("这个和对话框是同时显示的");

    clip_image006

    l 你会发现Smobiler在MessageBox.Show的最后面是一个匿名方法(这是一个委托实例,如果对委托不太明白可以先补充一下这方面的相关知识),这就是异步回调,即在客户端用户点击SmoMessageBox后,要触发的后续操作,就需要写到这个匿名方法中(也可以是委托实例)。如下图所示。

    clip_image008

    l 在Smobiler的很多功能中都需要使用这种方式,比如this.Client.GetClipboard获取剪切板的数据,就需要在回调中获取当前的数据。或this.Client.GetNetWorkType获取网络类型等方法。

  • 相关阅读:
    Python:FriendFeed的Tornado Web Server
    用psake来简化自动化脚本的构建
    Eucalyptus企业云计算
    兰州大学百年校庆风雨百年萃英路
    JQuery EasyUI弹出对话框解决Asp.net服务器控件无法执行后台代码的方法
    Winform开发框架之权限管理系统
    厚积薄发,丰富的公用类库积累,助你高效进行系统开发(2)常用操作
    Socket开发框架之数据采集客户端
    Winform开发框架之终极应用
    Winform分页控件使用详细介绍
  • 原文地址:https://www.cnblogs.com/smobiler/p/10972220.html
Copyright © 2011-2022 走看看