コンソールアプリケーションの信頼できるタイマー -- c# フィールド と .net フィールド と vb.net フィールド と timer フィールド 関連 問題

Reliable timer in a console application












105
vote

問題

日本語

.NET 3つのタイマータイプがあります(を参照)。 .NET Frameworkクラスライブラリ のタイマークラスの比較)。メインスレッドが忙しい場合は他のタイプがドリフトする可能性があるため、スレッドタイマーを選択しました。これは信頼できるように必要です。

このタイマーがタイマーの制御で機能する方法が別のスレッドに置かれているので、ビジーではない場合は、作業開始が完了したときに常にク完了が完了します。

コンソールアプリケーションのこのタイマーの問題は、タイマーが別のスレッド上で刻み目がある間に、メインスレッドがアプリケーションの閉じるものは何もしていないことです。

while true ループを追加しましたが、タイマーが消灯したときにメインスレッドがビジーすぎます。

英語

I am aware that in .NET there are three timer types (see Comparing the Timer Classes in the .NET Framework Class Library). I have chosen a threaded timer as the other types can drift if the main thread is busy, and I need this to be reliable.

The way this timer works in the control of the timer is put on another thread so it can always tick along with the work begin completed on the parent thread when it is not busy.

The issue with this timer in a console application is that while the timer is ticking along on another thread the main thread is not doing anything to the application closes.

I tried adding a while true loop, but then the main thread is too busy when the timer does go off.

</div
           

回答リスト

59
 
vote
vote
ベストアンサー
 

メインスレッドをブロックするには、 Console.ReadLine() のようなものを使うことができますので、他のバックグラウンドスレッド(タイマースレッドのように)はまだ機能します。 実行をブロックするそれから(必要な場合)メインスレッドを解放するためにそのAutoReseTeventオブジェクトのset()メソッドを呼び出すことができます。また、Timerオブジェクトへの参照が範囲外に出ないことを確認してください。

 

You can use something like Console.ReadLine() to block the main thread, so other background threads (like timer threads) will still work. You may also use an AutoResetEvent to block the execution, then (when you need to) you can call Set() method on that AutoResetEvent object to release the main thread. Also ensure that your reference to Timer object doesn't go out of scope and garbage collected.

</div
 
 
20
 
vote

manualresetevent をブロックする処理終了時のメインスレッド、およびタイマーの処理が終了したら、 Reset() を呼び出します。これが継続的に実行する必要があるものである場合は、コンソールアプリの代わりにこれをサービスプロセスに移動することを検討してください。

 

Consider using a ManualResetEvent to block the main thread at the end of its processing, and call Reset() on it once the timer's processing has finished. If this is something that needs to run continuously, consider moving this into a service process instead of a console app.

</div
 
 
0
 
vote

msdn とその他の回答は、直ちに終了せずにSystem.Threading.Timerを使用したコンソールアプリケーションの最小の動作例:

<事前> <コード> private static void Main() { using AutoResetEvent autoResetEvent = new AutoResetEvent(false); using Timer timer = new Timer(state => Console.WriteLine("One second has passed"), autoResetEvent, TimeSpan.Zero, new TimeSpan(0, 0, 1)); autoResetEvent.WaitOne(); }
 

According to MSDN and the other answers, a minimal working example of a Console application using a System.Threading.Timer without exiting immediately :

private static void Main() {     using AutoResetEvent autoResetEvent = new AutoResetEvent(false);     using Timer timer = new Timer(state => Console.WriteLine("One second has passed"), autoResetEvent, TimeSpan.Zero, new TimeSpan(0, 0, 1));     autoResetEvent.WaitOne(); } 
</div
 
 

関連する質問

9  SharePoint:タイマージョブ+ SharePoint System RightsからSTSADMを実行する  ( Sharepoint executing stsadm from a timer job sharepoint system rights ) 
私は、地元の管理者のWindows権限を持ち、 SHAREPOINTSystem SharePoint権限を持つためにSharePoint Timerジョブが必要な異常な状況を持っています。 ローカル管理者のメンバーであるアカウントを使用するために、タイマー...

20  Timer.ScheduledTimerはSwift 3では機能しません  ( Timer scheduledtimer does not work in swift 3 ) 
メソッド func adjustmentBestSongBpmHeartRate() を1.1秒ごとに呼び出したい。私はタイマーを使いましたが、うまくいきません。私は文書を読み、たくさんのサンプルコードを見つけました、それはまだ仕事をします!私が逃したことはあ...

16  タイマーベースのイベントトリガー  ( Timer based event triggers ) 
現在、特定の要件を備えたプロジェクトに取り組んでいます。これらの簡単な概要は次のとおりです。 データは外部WebServices から取得されます。 データはSQL 2005 に保存されています データはWeb GUI を介して操作されます。 Webサービ...

0  目的C 2分からカウントダウンするタイマーを作るにはどうすればよいですか。  ( Objective c how do i make a timer that counts down from two minutes ) 
私は答えのためにインターネットを捜したが、運がいない。私はを試しました <事前> <コード> - (void)viewDidLoad { [super viewDidLoad]; twoMinTimer = [NSTimer scheduledTimerW...

100  gettimeofday()はマイクロ秒の解像度であることが保証されていますか?  ( Is gettimeofday guaranteed to be of microsecond resolution ) 
私はもともとWin32 APIのために書かれたゲームをLinuxに移植しました(WILS32ポートのOS XポートをLinuxに移植する)。 プロセスの起動以降、常時秒を与えることで QueryPerformanceCounter を実装しました: <事前> ...

0  Javaで終了した前後の定期的なタスクを定期的にスケジュールする  ( Schedule periodic task at a fixed duration after previous one finished in java ) 
Timer.scheduleAtFixedRate を使用して、スレッドを実行するアプリケーションを書きました。 <事前> <コード> this.ExtractorTimer=new Timer(); this.ExtractorTimer.schedul...

2  HAXEを使用した遅延関数に引数を渡します  ( Pass arguments to a delayed function with haxe ) 
を介して呼ばれる関数に引数を渡す簡単な方法があるかどうかわかりますか <事前> <コード> haxe.Timer.delay(func, delay); 「簡単」では、カスタムタイマーを作成せずに意味します。 ...

0  System.Web.UI.Timer Ontickの前にJavaScriptを実行する方法  ( How to run javascript prior to system web ui timer ontick ) 
タイマーのOntickイベントが進むことができることを確認するためにクライアント側のスクリプトが必要です。 Timer1のポストバックが発生する前に、 concontinue()を呼び出す方法 ユーザーがキャンセルを選択した場合はポストバックをキャンセルす...

105  コンソールアプリケーションの信頼できるタイマー  ( Reliable timer in a console application ) 
.NET 3つのタイマータイプがあります(を参照)。 .NET Frameworkクラスライブラリ のタイマークラスの比較)。メインスレッドが忙しい場合は他のタイプがドリフトする可能性があるため、スレッドタイマーを選択しました。これは信頼できるように必...

0  C:コードの一部がselect()で実行されません  ( C part of the code doesnt execute under select ) 
私はこのようなものを持っています: <事前> <コード> #define QUIT_TIME 5 int main(int argc, char **argv) { //... SOCKETS STUFF .... fdmax = pa...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有