使用“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,如需转载请自行联系原作者
目录
相关文章
|
5月前
|
前端开发
cursor
cursor
30 0
|
存储 SQL 数据可视化
MySQL_01--游标CURSOR--通过游标(CURSOR)实现对select选择集的迭代使用,解决在Navicat中声明游标就一直报错的问题
我的需求是,一条一条的读取并使用select选择集的结果,使用的数据库可视化软件是Navicat。 但是我在使用游标的过程中一直在游标声明处就报错,试了很多方法,改名字,调整变量顺序都不管用,最后发现,游标需要定义在存储过程(Stored Procedure)函数里。
|
Go C++
OPEN CURSOR vs SELECT
OPEN CURSOR vs SELECT
105 0
OPEN CURSOR vs SELECT
|
SQL 存储 数据库
Oracle-cursor游标
游标的使用
1395 0
sql 中CURSOR 的使用
sql 中CURSOR 的使用http://www.bieryun.com/3273.html CURSOR是游标,常用于脚本处理。 这里主要介绍自己常用的方法,同时也会把网上的一般格式进行解释。
1685 0