0

私は、 C# (.NET 4)xでミリ秒ごとに定期的な (比較的長時間実行される) 計算を実装するための最適なソリューションを検討してきました。

  1. xそれが 10000 (10 秒)だとしましょう。

    おそらく、この場合の最善の解決策は、DispatcherTimer10 秒ごとにティックすることです。 関数では、開始するコードのみになります
    (長時間実行されるタスクを完了するのに約 5 秒かかると仮定します)。すぐに終了し、タスクは何かを計算するのに忙しいでしょう。void timer_Tick(object sender, EventArgs e)Task
    timer_Tick

  2. x<1000 (1 秒) はどうですか?

    Task1 秒ごとに作成して開始する大きなパフォーマンス オーバーヘッドはありませんか?
    そうでない場合、制限時間は何xですか? つまり、いくつかの小さな値の場合、プログラムが終了しないまで常に実行xを開始する方がよいでしょう。Task作成されたタスク内では、比較的長時間実行される関数を呼び出すDispatcherTimer毎秒のティックがありxます (おそらく 5 秒ではなく、現在は 1 秒未満ですが、それでも比較的長いです)。

    ここで技術的な問題が発生しますTask。プログラムが実行されるまで永久に実行される を開始するにはどうすればよいですか? (は十分に小さい)ごとに定期的にカチカチ音をたてるDispatcher Timerの内部だけが必要です。 私はこの方法を試しました:Taskxx

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;
    }
}
4

0 に答える 0