如何避免重复的Cursor.Current语句?

时间:2012-09-30 08:03:52

标签: c# error-handling cursor try-catch-finally

如果我在处理任务之前打开WaitCursor然后将其恢复为默认值,我经常会得到这种代码模式:

try {
    Cursor.Current = Cursors.WaitCursor;
    MyProcessingTask();
}
catch (Exception ex) {
    Cursor.Current = Cursors.Default;
    MessageBox.Show(ex.ToString());
}
finally { Cursor.Current = Cursors.Default; }

我需要在Cursor.Current = Cursors.Default;块中包含catch,以便为MessageBox提供默认光标以供使用。

有没有更好的方法来编写此代码而无需编写两个Cursor.Current = Cursors.Default;语句?

5 个答案:

答案 0 :(得分:2)

您可以创建一个一次性类并利用using语法糖,即:

class WaitingCursor : IDisposable
{
    public WaitingCursor()
    {
        Cursor.Current = Cursors.WaitCursor;
    }
    public void Dispose()
    {
        Cursor.Current = Cursors.Default;
    }
}

用法:

try
{
    using (var wcurs = new WaitingCursor())
    {
        MyProcessingTask();
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.ToString());
}

答案 1 :(得分:1)

您可以在try / finally块中嵌套try / catch块:

try {
    try {
        Cursor.Current = Cursors.WaitCursor;
        MyProcessingTask();
    }
    finally { Cursor.Current = Cursors.Default; }
}
catch (Exception ex) {
    MessageBox.Show(ex.ToString());
}

这是否更好可能受到意见。它减少了一些代码重复,但它(并不是我的眼睛)有一个熟悉的&#34;期待它。有人可能会在6个月内看到这一点,并将其重构为熟悉的try / catch / finally结构(并在catch块中失去光标更改)。< / p>


顺便说一句,在这个低级别捕获所有异常的一般模式通常是不受欢迎的。通过&#34;处理&#34;只要显示Message,每个可能的例外情况都会失去潜在的调试帮助。我通常建议a)你只处理特定的异常,你的代码实际上有一个合理的处理策略,和b)让所有其他异常传播到顶级异常处理程序a)可能会显示一条消息,但b)还会记录异常的所有相关部分,包括调用堆栈等。

吞下异常(如此处)可能意味着应用程序不处于适合状态以继续运行,但会尝试这样做。最终的崩溃(如果它发生)更难以诊断。

答案 2 :(得分:1)

这样的事情

        Exception exception = null;
        try
        {
            Cursor.Current = Cursors.WaitCursor;
            MyProcessingTask();
        }
        catch (Exception ex)
        {
            exception = ex;
        }

        Cursor.Current = Cursors.Default;
        if (exception!= null)
            MessageBox.Show(exception.ToString());

尽管这似乎是一个可行的解决方案,但我宁愿建议保留双光标设置,因为我希望在Catch块内部处理所有异常逻辑。

答案 3 :(得分:0)

try ... finally语句嵌套在现有try语句的try ... catch块中,如下所示:

try {
    Cursor.Current = Cursors.WaitCursor;
    try {
        MyProcessingTask();
    }
    finally {
        Cursor.Current = Cursors.Default;
    }
}
catch (Exception ex) {
    MessageBox.Show(ex.ToString());
}

答案 4 :(得分:0)

您可以通过扩展方法简化此操作:

static void ProcessWithWaitCursor(this Action task)
{
    try {
        Cursor.Current = Cursors.WaitCursor;
        task();
    }
    catch (Exception ex) {
        Cursor.Current = Cursors.Default;
        MessageBox.Show(ex.ToString());
    }
    finally { Cursor.Current = Cursors.Default; }

}

然后就这样使用它:

MyProcessingTask.ProcessWithWaitCursor()

这将消除您要执行此操作的所有地方的所有重复代码。