4

複雑な API を介して大きくて見苦しいサードパーティ システムで動作するアプリケーションを作成しています。システムでエラーが発生することもありますが、プログラムがこのエラーに直面するのを待っていると手遅れになる可能性があります。

したがって、別のスレッドを使用して、次のようにシステムの状態を確認します。

while (true)
{
    ask_state();
    check_state();
    System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));
}

システム状態を 100 ミリ秒に 1 回チェックするか、1 分に 1 回チェックするかは問題ではありません。

しかし、 Thread.Sleep() を使用するのは悪い習慣だと聞いたことがあります。なんで?そして、この状況で何ができますか?

4

3 に答える 3

5

理由の 1 つはThread.Sleep()、コードが他のことを行うのを妨げていることです。最近の取り組みは、ブロッキングを最小限に抑えることです。たとえば、node.js はノンブロッキング言語です。

Timer更新: C#のクラスのインフラストラクチャについてはわかりません。たぶんそれもブロックしています。

100 ミリ秒ごとに 3 番目の API をチェックするタスクをスケジュールできます。このようにして、その 100 ミリ秒の間に、プログラムは他のタスクを実行できます。

更新:この類推は役立つかもしれません。オペレーティング システムを病院と比較し、スレッドをその病院の看護師と比較すると、スーパーバイザー (プログラマー) はポリシーを選択できます。

  1. 各看護師 (スレッド) に 1 人の患者 (ジョブ、実行するタスク) だけを監視するように依頼するか、各チェックの間に彼女が 1 時間待機する場合でも (Sleep()メソッド)
  2. 各看護師に各患者のチェックを依頼し、次のチェックまでの合間に他の患者のチェックを続けます。

最初のモデルはブロッキングです。スケーラブルではありません。しかし、2 番目のモデルでは、少数の看護師でも多くの患者にサービスを提供できる可能性があります。

于 2013-11-15T07:45:50.970 に答える
0

タイマーを任意のミリ秒に設定し、チェックメソッドが完了するのを待ちます。ところで、永遠のループを使用しますか、それとも完全なコードではありませんか?
わかりました、これは私が話していることのサンプルです:

public void myFunction()
{
int startCount = Environment.TickCount;
ask_state();
check_state();

while (true)
{
if (Environment.TickCount - startCount >= 20000) //two seconds 
{
break;
}
Application.DoEvents();
}
}

//Now you have an organized function that makes the task you want just call it every
// time interval, again you can use a timer to do that for you

private void timer_Tick(object sender, EventArgs e)
{
            myFunction();
}

幸運を

于 2013-11-15T07:50:06.193 に答える