私は、 C# (.NET 4)x
でミリ秒ごとに定期的な (比較的長時間実行される) 計算を実装するための最適なソリューションを検討してきました。
x
それが 10000 (10 秒)だとしましょう。おそらく、この場合の最善の解決策は、
DispatcherTimer
10 秒ごとにティックすることです。 関数では、開始するコードのみになります
(長時間実行されるタスクを完了するのに約 5 秒かかると仮定します)。すぐに終了し、タスクは何かを計算するのに忙しいでしょう。void timer_Tick(object sender, EventArgs e)
Task
timer_Tick
x
<1000 (1 秒) はどうですか?Task
1 秒ごとに作成して開始する大きなパフォーマンス オーバーヘッドはありませんか?
そうでない場合、制限時間は何x
ですか? つまり、いくつかの小さな値の場合、プログラムが終了しないまで常に実行x
を開始する方がよいでしょう。Task
作成されたタスク内では、比較的長時間実行される関数を呼び出すDispatcherTimer
毎秒のティックがありx
ます (おそらく 5 秒ではなく、現在は 1 秒未満ですが、それでも比較的長いです)。ここで技術的な問題が発生します
Task
。プログラムが実行されるまで永久に実行される を開始するにはどうすればよいですか? (は十分に小さい)ごとに定期的にカチカチ音をたてるDispatcher Timer
の内部だけが必要です。 私はこの方法を試しました:Task
x
x
CancellationTokenSource CancelTokSrc = new CancellationTokenSource();
CancellationToken tok = CancelTokSrc.Token;
ConnCheckTask = new Task(() => { MyTaskMethod(tok); }, tok, TaskCreationOptions.LongRunning);
void MyTaskMethod(CancellationToken CancToken)
{
MyTimer = new DispatcherTimer(); // MyTimer is declared outside this method
MyTimer.Interval = x;
MyTimer.Tick += new EventHandler(timer_Tick);
MyTimer.IsEnabled = true;
while (true) ; // otherwise task exits and `timer_Tick` will be executed in UI thread
}
- 編集: -
集中的な計算とは、指定されたサーバーとの接続が確立されているかどうかを確認することを意味していました。接続が切断されたときにユーザーに警告するために、接続を監視したいと考えています。
接続の確認は次のように実装されています ( Ragnarのおかげです):
private bool CheckConnection(String URL)
{
try
{
HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest;
request.Timeout = 15000;
request.Credentials = CredentialCache.DefaultNetworkCredentials;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
return response.StatusCode == HttpStatusCode.OK ? true : false;
}
catch (Exception e)
{
Debug.WriteLine(e.ToString());
return false;
}
}