2016-04-24 15 views
1

tick-count関連の作業を行うには、Windows Formsアプリケーションでメッセージループをフックする必要があります。Windows Formsアプリケーションでメッセージループをフックしますか?

非同期メソッド(async/await)を使用してtcpサーバーを開発しています。マルチスレッドプロセスで競合条件を処理するのを避けています。これは基本的に私が非同期/待機モデル。この制限のため、バックグラウンドスレッドを作成してティックカウンティングを行うことはできません。なぜなら、これでマルチスレッドコードになるからです。

Windowsフォームのメッセージループを何とかしていると思っていたので、Windowsフォームオブジェクトの同じスレッドを使ってティックカウント関連のものを簡単に行うことができました。メソッドまたはイベントをWindows.Forms.Applicationクラスに追加します。

誰かが私の必要なことをする方法を知っていますか?

ありがとうございました。

+0

非同期/待機はマルチスレッドです... –

+0

こんにちは。 @GlenThomas。私はasync/awaitがマルチスレッドであることを知っていますが、このモデルのマルチスレッドは低レベルのレイヤーでのみ実行されます。 async/awaitを使用してUIスレッドに書き込むすべてのコードは、UIスレッドで実行されます。 – ptr0x

+0

非同期コードはUIスレッドでは実行されません –

答えて

2

私はあなたの最善のアプローチは、時限間隔であなたのコードを実行しますタイマーを使用するかもしれないと思う:

var aTimer = new System.Timers.Timer(); 
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
aTimer.Interval = 5000; 
aTimer.Enabled = true; 



// What you want to happen when the Elapsed event is raised. 
private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    // Do something 
} 
+0

単なる補遺:タイマーのコールバックを特定のSynchronizationContextで実行する必要がある場合は、Timer.SynchronizingObject!を設定します。 – ptr0x

1

あなたがメッセージループを上書きしたくないでしょう。それははるかに基本的なGUIソリューションではかなり一般的なアプローチでしたが、文字通り.NETの最後の手段です。

通常の「ダニ」が必要なので、最も適切な解決策はタイマーです。 UIスレッドで実行したいので、System.Windows.Forms.Timerを使用する必要があります。

+0

こんにちはスティーブン!私はSystem.Timers.Timerを使用して終了します。なぜなら、 "ui layer"の依存関係を持たないアセンブリでこのタイマーを宣言する必要があるからです。また、私が使用しているこのタイマーは、特定の同期コンテキストでコールバックを実行する可能性があります。 – ptr0x

関連する問題