6

VB.Net 2.0 に従来の WinForms Mdi アプリがあり、これに機能を追加しています。追加の 1 つは、現在の時刻が指定された値 (期限) に近づいたときに発生させる必要がある警告です。私の意図は、締め切りまで 1 時間未満になるまで 1 時間に 1 回時間をチェックし、時間切れになるまで指定された間隔で警告を表示することです。

ユーザーは締め切りまで、そして締め切り後もアプリを使い続けることができる必要がありますが、締め切りが近づいていることを定期的に知らせる必要があります。

このアプリはまだ System.Threading を使用しておらず、現時点での私の知識は限られています。利用可能な 3 つの異なる Timer() メソッドがあることは知っています。

  • System.Threading.Timer()、
  • Windows.Forms.Timer() および
  • System.Timers.Timer()

私の質問は、これに最適な方法はどれですか? スレッド タイマーを使用しようとしましたが、WinForms はスレッド セーフではないため、別のクラスにアクセスしようとすると実行時エラーが発生しました。クラス/フォームをスレッドセーフにする価値はありますか? 私は完全に軌道から外れていますか?

ありがとう。

4

5 に答える 5

11

この記事はかなりよく説明しています:

.NET Framework クラス ライブラリのタイマー クラスの比較

System.Windows.Forms.Timer があなたにぴったりのようです。

私のガイドライン: タイマーをメインの GUI スレッドで実行する場合は、Windows.Forms.Timer を使用してください。タイマーがスレッド プール スレッドで非同期に呼び出されても問題ない場合、または System.Windows.Forms.Timer で発生しがちな小さな遅延を経験したくない場合は、System.Timers.Timer を使用します。System.Threading.Timer は他の 2 つとは異なるインターフェイスを持ち、スレッドセーフではありません。個人的には、私はファンではありません。

于 2008-10-10T16:03:35.857 に答える
6

Formsタイマーを使用するだけです。それほど正確ではないことを読んだと思いますが、そうする必要はないようです。

于 2008-10-10T15:36:40.153 に答える
2

Windows.Forms.Timer() は、クロス スレッド マーシャリングの問題を処理するため、この場合に最適であることに同意します。

便利な関連リンク:

于 2008-10-11T20:54:07.173 に答える
0

わかりました、まず最初に...

ユーザーにフォームを表示し、バックグラウンドで何かをしたい場合は、BackgroundWorkerクラスを使用します。以前はうまくいきました。また、前述のようにメソッドを呼び出す必要があり、クリスが言ったように、実際よりも難しいように聞こえます。

ここに私があなたを助けると思うリンクがあります。
http://msdn.microsoft.com/en-us/library/ms171728(VS.80).aspx

于 2008-10-10T16:04:52.780 に答える
0

The System.Forms.Timer actually works on the main thread using the windows message queue. This makes it somewhat inacurate but since you don't really need ms precision it's good enough. You could use one of the other timers that work on a separate thread but since you need to activate a winforms component that work in the main you'll need to use Form.Invoke or some other way to pass the event to the main thread - which would cause some latency as well. In conclusion use the System.Forms.Timer when you need to activate a winforms based component.

于 2008-10-10T16:09:35.937 に答える