C#のタイマークラスについてですが、C#には3つのタイマークラスがあります。
1. System.Windows.Forms で定義する
2. System.Threading.Timerクラスで定義
3. System.Timers.Timer クラスで定義
System.Windows.Forms.TimerはWinFormに適用され、Windowsのメッセージ機構を通じて実装されます。これはVBやDelphiのタイマーコントロールに似ており、内部ではAPIのSetTimerを使って実装されます。 主な欠点はタイミングが正確でないこと、そしてメッセージループが必要であり、これはコンソールアプリケーションには提供されないことです。
System.Timers.TimerはSystem.Threading.Timerと非常に似ており、.NETスレッドプールを通じて実装されており、軽量で正確なタイミングが可能で、アプリケーションやメッセージに特別な要件はありません。 System.Timers.TimerはWinFormにも適用でき、上記のタイマーコントロールを完全に置き換えます。 欠点は直接ドラッグ&ドロップをサポートしておらず、手動コーディングが必要なことです。
例:
System.Timers.Timerクラスを使います
System.Timers.Timer t = new System.Timers.Timer(10000); タイマークラスをインスタンス化し、間隔を10,000ミリ秒に設定します。
t.Elapsed += new System.Timers.ElapsedEventHandler(theout); 時間が来たらイベントを実行します。
t.AutoReset = true; 一度実行(false)かずっと実行するか(true)を設定する;
t.Enabled = 真; System.Timers.Timer.Elapsedイベントを実行するかどうか、
public void theout(object source, System.Timers.ElapsedEventArgs e)
{
MessageBox.Show(「OK!」);
}
C#における3つのタイマー使用の類似点と相違点の実験的解析
http://dotnet.chinaitlab.com/CSharp/737740.html
C#には3種類のタイマーがあります:
1. Windowsベースの標準タイマー(System.Windows.Forms.Timer)
2. サーバーベースのタイマー(System.Timers.Timer)
3. スレッドタイマー(System.Threading.Timer)
3つのタイマーの類似点と相違点、特にスレッド関連の部分を分析するために、いくつかの小さな実験を始めましょう。
実験例のスクリーンショット:
1. 標準Windowsベースのタイマー(System.Windows.Forms.Timer)
まず注意すべきは、Windows Timerはシングルスレッド環境向けに設計されているということです
このタイマーはVisual Basic 1.0バージョンから製品に搭載されており、ほとんど変更されていません
このタイマーは最も使いやすく、ツールボックスからタイマーコントロールをフォームにドラッグし、イベントや間隔などのプロパティを設定するだけです
実験結果は単一スレッドの特性とも完全に一致しています:
1. このタイマーが始動すると、子スレッドIDは下の子スレッドIDリストに表示され、メインスレッドIDと同じです
private void formsTimer_Tick(オブジェクト送信機、EventArgs e)
{
i++;
lblSubThread.Text += "サブスレッド実行、スレッドID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
}
2. メインスレッドが5秒間一時停止されると、子スレッドが実行を一時停止し、以前に停止していた子スレッドが5秒後に実行されない場合は、次の子スレッドが直接実行されます(つまり数行の値を出力します)。
System.Threading.Thread.Sleep(5000);
3. 子プロセスのイベントを5秒間一時停止すると、メインウィンドウが5秒間応答しなくなります
4. スレッド静的変数を定義します:
[スレッドノイズ]
プライベート静的int i = 0;
各サブスレッドイベントに1つずつ追加し、スレッドの静的変数値をクリックすると増加したi値が表示されます
2. サーバーベースのタイマー(System.Timers.Timer)
System.Timers.Timerはフォームに依存しず、スレッドプールからスレッドを起動し、サーバー環境で動作するよう最適化された従来のタイマーのアップデート版です
VS2005ツールボックスには標準操作はなく、手動でコーディングする必要があります
使い方は2つあります。
1. SynchronizingObjectプロパティを通じてフォームに付ける
System.Timers.Timer timersTimer = new System.Timers.Timer();
timersTimer.Enabled = false;
タイマータイムr.Interval = 100;
timersTimer.Elapsed += new System.Timers.ElapsedEventHandler(timersTimer_Elapsed);
timersTimer.SynchronizingObject = this;
このようにして、実験は標準的なWindowsベースのタイマーとほぼ同じように動作しますが、上記の2回目の実験ではサブスレッドの実行も一時停止されますが、5秒後には以前にキューに入れていたすべてのタスクが実行されます(つまり数行の価値が抜けることはありません)。
2. SynchronizingObjectプロパティは使わない
このメソッドはマルチスレッドであり、つまり開始子スレッドとメインフォームは同じスレッド上にはありません。 しかし、問題もあります。サブスレッドは別のスレッドであるため、フォーム内のコントロールにはアクセスできず、プロキシ経由でのみアクセス可能です。
delegate void SetTextCallback(文字列テキスト);
出典:(http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html)- (ターン)C#_dash_Sinaブログにおける3つのタイマーオブジェクトの比較
。
。
void timersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//使用代理
文字列テキスト = "子スレッド実行、スレッドID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = 新しいSetTextCallback(SetText);
これ。 Invoke(d, new object[] { text });
i++;
}
プライベート・ヴォイド SetText(文字列テキスト)
{
lblSubThread.Text += テキスト;
}
このようにして、実験から再び次の結果が得られます。
1. このタイマーが起動すると、子スレッドIDは以下の子スレッドIDリストに表示され、メインスレッドIDとは異なります
2. メインスレッドをクリックして5秒間一時停止すると、サブスレッドは実行を続けます(インターフェース上では見えないかもしれませんが、サブスレッド内のファイルを出力すれば簡単に確認できます)
3. 子プロセスのイベントを5秒間一時停止しても、メインウィンドウが応答しなくなることはありません
4. サブスレッドイベントで毎回スレッドの静的変数に1を追加し、その静的変数が0か0かをクリックします(メインウィンドウのスレッド静的変数は変わりません)。
3. スレッドタイマー(System.Threading.Timer)
スレッドタイマーはフォームに頼らず、イベントの代わりにコールバックメソッドを用いるシンプルで軽量なタイマーで、スレッドプールスレッドによって駆動されます。
スレッドタイマーは、メッセージがスレッド上で送信されない状況で有用です。
使い方は以下の通りです:
System.Threading.Timer threadTimer;
public void ThreadMethod(Object state)
{
//使用代理
文字列テキスト = "子スレッド実行、スレッドID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = 新しいSetTextCallback(SetText);
これ。 Invoke(d, new object[] { text });
i++;
}
private void Form1_Load(object sender, EventArgs e)
{
threadTimer = new System.Threading.Timer(new System.Threading.TimerCallback(ThreadMethod), null, -1, -1);
}
一時停止コード:
threadTimer.Change(-1, -1);
この実験の効果は、サーバーベースのタイマーの第二の方法(System.Timers.Timer)と同じです。
もちろん、具体的な使用方法や原則は異なりますが、最も重要なのはこのメソッドがイベントメソッドではなくエージェントメソッドを用い、フォームやコンポーネントに依存せずに個別に実行できることです
以下は外国人によるまとめ表(3つの方法の違い):
Feature descrip{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer
タイマーがインスタンス化された後のリスナーの追加・削除のサポート。 はい いいえ はい
ユーザーインターフェーススレッドのコールバックをサポートしています Yes No Yes
スレッドプールから取得したスレッドからのコールバック はい はい いいえ
Windows Forms Designerでのドラッグ&ドロップをサポートしています。はい、いいえ、はい。
サーバーマルチスレッド環境での動作に適しています はい はい いいえ
タイマー初期化からコールバックへの任意の状態の渡しをサポートします。 いいえ、いいえ、いいえ。
IDisposableを実装する はい はい はい
一度きりのコールバックと定期的な繰り返されるコールバックをサポートします。はい、はい、はい
アプリケーションドメインの境界を越えてアクセス可能 はい はい はい
IComponentをサポートしています – IContainerでホスト可能なYes No Yes |