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

2 つのステートメントを記述せずにこのコードを記述するより良い方法はありCursor.Current = Cursors.Default;ますか?

4

5 に答える 5

2

使い捨てクラスを作成して、usingsyntact-sugar を利用できます。つまり、次のようになります。

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//構造にリファクタリングする可能性があります(そして、ブロック内のカーソルの変更が失われます)。catchfinallycatch


ところで、この低レベルですべての例外をキャッチするという一般的なパターンは、一般的に嫌われています。を表示するだけで考えられるすべての例外を「処理」すると、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 に答える