在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,如下图

Smobiler的MessageBox方法

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

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

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

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

Smobiler与Winform的对话框差异

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

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

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("这个和对话框是同时显示的");

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

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

基于.NET的APP开发和Windows开发,异步回调差别的更多相关文章

  1. Smobiler与Windows的异步回调差别

    Smobiler与Windows的异步回调差别--基于.NET的APP开发和Windows开发差别 基于.NET的APP开发和Windows开发,异步回调差别 Windows app开发 异步回调 S ...

  2. spring boot + vue + element-ui全栈开发入门——windows开发环境

     一.node.js开发环境 windows系统,去网站https://nodejs.org/en/download/,下载对应的安装程序,并安装Windows Installer (.msi) 接下 ...

  3. 用.NET开发通用Windows App

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:随着Windows 10的正式发布,作为.NET开发人员应该开始或多或少了解一下通用( ...

  4. 使用 Portable Class Library(可移植类库)开发 Universal Windows App

    今天在这里跟大家聊聊关于 Windows Universal 应用夸平台的问题,首先Universal Windows App的定义相信大家已经有所了解了(如果你是一个刚刚接触 Universal A ...

  5. 你知道吗?使用任何HTML5开发工具都可开发iOS、Android原生App

    APICloud App开发平台一直在不断升级开发工具库,这一年增加了众多开发工具.目的就是让开发者可以选择使用任何自己喜欢的HTML5开发工具去开发App.这次,APICloud把所有关于开发工具的 ...

  6. 翻译:打造基于Sublime Text 3的全能python开发环境

    原文地址:https://realpython.com/blog/python/setting-up-sublime-text-3-for-full-stack-python-development/ ...

  7. 【毕业设计】基于Android的家校互动平台开发(内含完整代码和所有文档)——爱吖校推(你关注的,我们才推)

    ☆ 写在前面 之前答应大家的毕业答辩之后把所有文档贡献出来,现在答辩已过,LZ信守承诺,把所有文档开源到了GitHub(这个地址包含所有的代码和文档以及PPT,外层为简单的代码).还望喜欢的朋友们,不 ...

  8. [ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [下篇]

    由于ASP.NET Core框架在本质上就是由服务器和中间件构建的消息处理管道,所以在它上面构建的应用开发框架都是建立在某种类型的中间件上,整个ASP.NET Core MVC开发框架就是建立在用来实 ...

  9. [转][ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [下篇]

    由于ASP.NET Core框架在本质上就是由服务器和中间件构建的消息处理管道,所以在它上面构建的应用开发框架都是建立在某种类型的中间件上,整个ASP.NET Core MVC开发框架就是建立在用来实 ...

随机推荐

  1. CSS 外边距合并。

    <div id = "parent"> <div id = "child"> demo </div> </div> ...

  2. Django REST framework+Vue 打造生鲜超市(七)

    目录 生鲜超市(一)    生鲜超市(二)    生鲜超市(三) 生鲜超市(四)    生鲜超市(五)    生鲜超市(六) 生鲜超市(七)    生鲜超市(八)    生鲜超市(九) 生鲜超市(十) ...

  3. python 整理数据中的图片

    import shutil import time import pymysql conn=pymysql.connect(host="222",user="root&q ...

  4. 微信小程序 bug及解决方案

    1.小程序遮罩滚动穿透问题 解决方案: <view class="mask" wx:if="{{showVipRights}}" catchtap='hi ...

  5. idea快捷

    IntelliJ Idea 常用快捷键 列表(实战终极总结!!!!) 1. -----------自动代码-------- 常用的有fori/sout/psvm+Tab即可生成循环.System.ou ...

  6. JVM学习②

    JVM运行机制 1.JVM启动流程 Java启动命令->装载配置寻找jvm.cfg->根据配置寻找JVM.dll(JVM主要实现)->初始化JVM,获得JNIEnv接口 2.JVM基 ...

  7. persistent_storage_worker.go

    package) ) :length],) ) :length]) } func (engine *Engine) persistentStorageInitWorker(shard int) {   ...

  8. 随手一记,maven打包

    <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-depen ...

  9. 【游戏开发】小白学Lua——从Lua查找表元素的过程看元表、元方法

    引言 在上篇博客中,我们简单地学习了一下Lua的基本语法.其实在Lua中有一个还有一个叫元表的概念,不得不着重地探讨一下.元表在实际地开发中,也是会被极大程度地所使用到.本篇博客,就让我们从Lua查找 ...

  10. Java基础系列--基础排序算法

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9082138.html 一.概述 基础排序算法包括:桶排序.冒泡排序.选择排序.插入排序等 ...