使用“using” 的 “Cursor”

很多时候,我们会写下面的这段代码:

复制代码
private void button1_Click(object sender, EventArgs e)
{Cursor cursor = Cursor.Current;this.Cursor = Cursors.WaitCursor;LongTimeMethod();this.Cursor = cursor;
}private void LongTimeMethod()
{for (int i = 0; i < 200; i++){label1.Text = i.ToString();label1.Refresh();System.Threading.Thread.Sleep(10);}
}
复制代码

这段代码在执行LongTimeMethod的时候,设置鼠标的状态为WaitCursor.

可是这段代码是有问题的,比如LongTimeMethod() 方法抛出异常的时候,Cursor 就会始终是WaitCursor.

所以比较安全的做法是:

复制代码
private void button1_Click(object sender, EventArgs e){Cursor cursor = Cursor.Current;try{this.Cursor = Cursors.WaitCursor;LongTimeMethod();}finally {this.Cursor = cursor;}}
复制代码

 

看到try,finally ,有没有让你想到什么呢?,对了using 可以生成try-finally

复制代码
public class WaitCursor : IDisposable
{private Cursor cursor;public WaitCursor(){this.cursor = Cursor.Current;Cursor.Current = Cursors.WaitCursor;}public void Dispose(){Cursor.Current = cursor;}
}
复制代码

使用的时候,只需要:

复制代码
private void button1_Click(object sender, EventArgs e)
{using(new WaitCursor()){LongTimeMethod();}
}
复制代码

 

在using块结束的时候,会自动的调用WaitCursor的Dispose方法,从而设置当前Cursor 为保存的cursor.

 

如果你仔细的看的话,你会发现Cursor 继承了IDisposable 接口。

image

所以有人就说了可以直接:

复制代码
private void button1_Click(object sender, EventArgs e)
{using (Cursor.Current = Cursors.WaitCursor){LongTimeMethod();}
}
复制代码

如果你第一次运行的话,可以发现的确能正常工作,可是事实上上面的代码是有问题的。

这段代码会调用Cursors.WaitCursor.Dispose() 方法,从而当你第二次调用的时候,你会得到null,因为WaitCursor已经dispose了:

image

 

有一种变通的方法,下面的代码可以正常工作:

复制代码
private void button1_Click(object sender, EventArgs e)
{using (Cursor.Current = new Cursor(Cursors.WaitCursor.CopyHandle())){LongTimeMethod();}
}
复制代码





本文转自LoveJenny博客园博客,原文链接:http://www.cnblogs.com/LoveJenny/archive/2013/03/13/2956922.html,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《看聊天记录都学不会C语言?太菜了吧》(21)(必懂!题解)在现实生活中,打擂台比赛争名次竟用的是冒泡排序?

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

ArcGIS 10.7如何获取矢量多边形所有折点的坐标(平面坐标和经纬度坐标)?

Descriptions:As shown in the figure below is a surface pattern spot, how to obtain the coordinates of each vertex (plane coordinates and latitude and longitude coordinates)? The results we want are as follows: Via data source,we get the information that…

Mahout分类算法学习之实现Naive Bayes分类示例

1.简介 (1) 贝叶斯分类器的分类原理发源于古典概率理论&#xff0c;是通过某对象的先验概率&#xff0c;利用贝叶斯公式计算出其后验概率&#xff0c;即该对象属于某一类的概率&#xff0c;选择具有最大后验概率的类作为该对象所属的类。朴素贝叶斯分类器(Naive Bayes Classifi…

一维条形码***技术(Badbarcode)

【转】http://future-sec.com/badbarcode.html 前言在日常生活中&#xff0c;条形码随处可见&#xff0c;特别在超市&#xff0c;便利店&#xff0c;物流业&#xff0c;但你们扫的条形码真的安全吗&#xff1f;之前TK教主在PacSec介绍的条形码攻击和twitter上的demo视频太炫酷&…

ArcGIS 10.7 模型构建器Model Builder空间建模流程化作业案例----影像拼接与掩膜裁剪

Model Builder(模型构建器)是一个用来创建、编辑和管理空间分析模型的应用程序,是一种可视化的编程环境,通过对现有工具的组合完成新模型或软件的制作,为设计和实现空间处理模型(包括工具、脚本和数据)提供了一个图形化的模型框架。 本文以影像数据的拼接和掩膜裁剪为例…

Hello Playwright:(4)自动化测试

利用 Playwright 提供的 API&#xff0c;我们在浏览器上做的很多事情都可以自动化。例如&#xff0c;搜索数据、填写表单和下载文件等等。但最适合的工作&#xff0c;就是自动化测试 Web 应用程序。自动化测试测试是软件开发中的一项基本任务&#xff0c;至少&#xff0c;你需要…

ArcGIS 10.7拆分多部件要素(Multipart Features)至单部件要素的两种方法

GIS中经常会出现多部件要素的现象,为了便于检查拓扑等关系,需要将其拆分为单个的部件。例如,在用同一个图层的多个图斑去裁剪(Clip)时,或者将多个不相邻的图斑进行合并(merge)时,可能会产生多部件要素,本文演示ArcGIS10.7版本中常见的两种拆分多部件要素至单部件要素…

spring-session + redis 实现集群 session 共享

2019独角兽企业重金招聘Python工程师标准>>> 目前市面上实现session共享的方案有很多&#xff0c;其中比较常用的是使用Tomcat、Jetty等web服务器提供的session共享功能&#xff0c;以此将session内容统一存放在数据库&#xff08;如mysql&#xff09;或者缓存&…

《看聊天记录都学不会Python到游戏实战?太菜了吧》(10)无底洞的循环

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

业务流水号规则生成组件

对于很多业务系统都需要生成业务流水号&#xff0c;如果订单号、购采单号等等&#xff1b;而这些业务流水号并不是简单的一个增长数值&#xff0c;它们很多时候都有一些不同的规则来定义&#xff0c;如不同类型的字母或地区拼音简写等。为了更灵活生成这些有规则的业务流水号Be…

ArcGIS中国工具(ArcGISCTools)3.2 安装教程(附安装包下载)

ArcGIS中国工具,简称CTools,集成在ArcGIS 10.x系列版本中。本文在ArcGIS10.7的基础之上,演示3.2版本安装过程,并提供下载地址共大家学习和交流。 一、安装过程

阿里云ECS,搭建MySQL5.7数据库环境

为什么80%的码农都做不了架构师&#xff1f;>>> 配置mysql yum源 [rootiZbp1j6oiamq7t2otpryarZ ~]# cd /data/ [rootiZbp1j6oiamq7t2otpryarZ data]# ll total 0###################################下载mysql源安装包# [rootiZbp1j6oiamq7t2otpryarZ data]# wge…

《看聊天记录都学不会Python到游戏实战?太菜了吧》(9)集万家之长不死 python

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

【重磅】ArcGIS 10.8手把手经典图文安装教程(附安装包全套装下载,亲测可用)

ArcMap时代的最后一版软件,未来官方对ArcMap的支持将仅限于提供补丁,更新和新环境支持,换句话说ArcMap10.8.X将会是最终版本,以后不会再有ArcMap10.9了,官方建议所有人在完成工作流程后立即迁移到ArcGIS Pro。 时间真快,ArcGIS 10.7刚装完没几天,作为GISer的我,有的开始…

聊聊 C# 中的 Visitor 模式

前言 Visitor模式在日常工作中出场比较少&#xff0c;如果统计大家不熟悉的模式&#xff0c;那么它榜上有名的可能性非常大。使用频率少&#xff0c;再加上很多文章提到Visitor模式都着重于它克服语言单分派的特点上面&#xff0c;而对何时应该使用这个模式及这个模式是怎么一…

AcWing 889. 满足条件的01序列(卡特兰数应用)

满足条件的01序列 假设长度为n个序列要求满足题意1的前缀0的个数不能超过1的个数 将问题抽象为从(0, 0)到(n, n) 向上走一个代表这一步对应序列中的值是1&#xff0c;向右走代表序列中的值是0 要想满足1的前缀0的数量大于1的数量就需要满足所有路过的途径在y x这个函数个下面…

添加ASP.NET网站资源文件夹

ASP.NET应用程序包含7个默认文件夹&#xff0c;分别为Bin、APP_Code、App_GlobalResources、App_LocalResources、App_WebReferences、App_Browsers和“主题”文件夹。每个文件夹都存放ASP.NET应用程序的不同类型的资源。 方法 说明Bin  包含程序所需的所有已编译程序集&#…

《看聊天记录都学不会Python到游戏实战?太菜了吧》(8)我们开始做一个数字小游戏吧

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

Microsoft SQL Server 2019开发版安装配置教程

一、安装cn_sql_server_2019_developer_x64 双击setup.exe进行安转。 点击【安装】。 点击【全新SQL Server独立按住啊或向现有安装添加功能】。 点击【下一步】。

《看聊天记录都学不会C#?太菜了吧》(4)C# 中的尚方宝剑 “先斩后奏”

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…