この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 18870|答える: 1

[出典] C#の3タイマー実装

[リンクをコピー]
掲載地 2017/10/12 13:12:51 | | |
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




先の:c# ラムダ式集合の脱集団化による最小値
次に:Linq: 集合が空でないことを判定するためにCount() > 0を使わないでください
掲載地 2017/11/08 14:02:44 |
本当です。 すごくいいけど、なんで投稿に返信しなかったの?
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com