5

次のようなボタンクリックでコードを取得しました。

try
{
    Cursor = Cursors.WaitCursor;
    GenerateReports();
}
finally
{
    Cursor = Cursors.Default;
    GC.Collect();
    GenPacketBtn.Enabled = true;
}

カーソルがデフォルトに戻される場所は、finally ブロック以外にはありませんが、何らかの理由で「疲れて」デフォルトの状態に戻ります。これはなぜですか?また、すべてのプロセス (GenerateReports()) のビッグダディが完了するまで、「待機」を停止しないようにするにはどうすればよいですか?

4

1 に答える 1

3

代わりControl.UseWaitCursor = trueに使用してください。これはタイムアウトしません。

高価な操作が実行されている場合、Windows が引き継ぎ、Cursor.WaitCursor必要と思われるものに変更します。そのため、Cursor.WaitCursor を使用すると、タイムアウトが原因で (ただし、これについては完全にはわかりません)、Windows が以前の状態に関係なくカーソルの所有権を主張しているためです。また、サードパーティの PDF コンバーターと呼ばれる高価なタスクを実行するときに、カーソルが期待どおりに動作しないという同様の状況がありましたが、優先事項ではなかったため、問題の性質について詳しく調査しませんでした。

少し読んだ後、砂時計カーソルの設定は見た目よりも少し複雑であることがわかりました。

.net WaitCursor: 砂時計を表示するのはどれほど難しいでしょうか?

また、補足Cursor.Current = Cursors.WaitCursorとして、これによりカーソルがすぐにビジーに変更されるため、使用する必要があります。詳細については、https ://stackoverflow.com/a/302865/1463733 を参照してください

于 2015-12-09T20:36:35.270 に答える