2017-12-22 16 views
-5

私はボタンとタイマーを持っていますが、10分ごとにコードを実行し、複雑さのために約2分かかります。私はボタンを押して別のフォームを開くとき、私の問題は、すべての計算が終了するまで、タイマーがプログラムをフリーズし始めるときに、私はタイマーが実行を開始し、私は使用することができませんフォームを使用することはできませんタイマーのない他のフォーム。バックグラウンドでタイマーを実行するメソッドが見つからないため、タイマーで計算中に他のものを自分のフォームに入れたいのですがc#バックグラウンドでタイマーを動作させる方法

+1

コードを入力してください。 – Toodoo

+2

[ask]を読んで[ツアー]を受けてください – Plutonix

+2

timerメソッド内で 'BackgroundWorker'または' Task'を使用してください。 Winformsタイマーは常にUIスレッドで実行されるため、あなたが言うようにフリーズします。 – Alejandro

答えて

2

Timer.TickイベントハンドラーはUIスレッドで実行されます。私。アプリケーションのメインスレッド。このスレッドは、アプリケーションを画面上に描画します。 UIスレッドでイベントハンドラを実行すると、このハンドラでUIコントロールを使用できますが、その時間にUIが描画されないため、Tickイベントハンドラで長時間実行される操作ではアプリケーションはフリーズします。

代わりにSystem.Threading.Timerを使用する必要があります。コールバックはバックグラウンドスレッドで実行されます。アプリケーションはUIを描画するためにメインスレッドを使用し、他のスレッドのポートからデータを読み込みます。

timer = new System.Threading.Timer(_ => CheckPort(), null, 30000, 0); 

あなたの時間を30000に置き換えてください!

private void CheckPort() 
{ 
    //view form 
} 

希望すると、これが役立ちます。

関連する問題