在 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 获取网络类型等方法.
来源: https://www.cnblogs.com/amanda112/p/10578910.html