如何避免Cursor.Current语句重复



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

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

我需要在catch块中有Cursor.Current = Cursors.Default;,以便给MessageBox一个要使用的默认光标。

有没有更好的方法可以在不必编写两个Cursor.Current = Cursors.Default;语句的情况下编写此代码?

您可以创建一个一次性类并利用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());
}

这个怎么样

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块中处理。

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

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

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


顺便说一句,在这种低水平上捕获所有异常的一般模式通常是不受欢迎的。通过只显示Message来"处理"每一个可能的异常,您就失去了潜在的调试帮助。我通常建议a)只处理代码实际有合理策略处理的特定异常,b)将所有其他异常分配给顶级异常处理程序,a)可能会显示消息,但b)还记录异常的所有相关部分,包括调用堆栈等。

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

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

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

您可以通过扩展方法简化它:

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()

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

相关内容

  • 没有找到相关文章

最新更新