使用“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();
    }
}

 

本文參考自:http://www.codeproject.com/Articles/6287/WaitCursor-hack-using-using


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM