如果我在处理任务之前打开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;
语句?
答案 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());
}
这是否更好可能受到意见。它减少了一些代码重复,但它(并不是我的眼睛)有一个熟悉的"期待它。有人可能会在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()
这将消除您要执行此操作的所有地方的所有重复代码。