1

如果我在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;语句?

4

5 回答 5

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());
}
于 2012-09-30T08:11:19.760 回答
1

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

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

这是否更好可能取决于意见。它减少了一些代码重复,但它(在我看来)并没有“熟悉”的外观。有人可能会在 6 个月的时间内看到这一点,并将其重构回熟悉的try//结构catchfinally并丢失块中的光标更改catch)。


顺便说一句 - 在这个低级别捕获所有异常的一般模式通常是不受欢迎的。通过仅显示 来“处理”所有可能的异常Message,您将失去潜在的调试帮助。我通常会建议 a) 你只处理你的代码实际上有一个明智的策略来处理的特定异常,并且 b) 让所有其他异常传播到顶级异常处理程序 a) 可能显示一条消息,但是 b ) 还会记录异常的所有相关部分,包括调用堆栈等。

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

于 2012-09-30T08:11:51.357 回答
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 块内处理。

于 2012-09-30T08:12:48.970 回答
0

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

try {
    Cursor.Current = Cursors.WaitCursor;
    try {
        MyProcessingTask();
    }
    finally {
        Cursor.Current = Cursors.Default;
    }
}
catch (Exception ex) {
    MessageBox.Show(ex.ToString());
}
于 2012-09-30T08:12:57.467 回答
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()

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

于 2012-09-30T08:20:33.703 回答