2011-11-04 7 views
0

私は、たとえば、その確定時にアナウンスを行うには、それが勝っているスレッド上で動作する機能を行う必要があります。アナウンスをXまたはあらかじめ定義された時間間隔で送信しますか?

  • 「で、当社のWebサイトを参照してください:....」5分ごと
  • を実行するように設定します
  • 「のランクにあなたの場所を確認します....」を計算するために、睡眠と、どのようにしながら、私は、スレッドタイマまたはスレッドを使用する必要がある場合は10分ごと

私は少し混乱しています実行するように設定すべてのアナウンスを実行する必要があります。私がなされるべき各発表を保持するクラスのリストを検討していた始めるため

、クラスでList<MyTimer>のようなもののように:使用後

public MyTimer 
{ 
    public string Announcement { get; set; } 
    public int Interval { get; set; } // if interval is 0 means 
             // it will run just once 
    public bool hasSpecificTime { get; set; } // if this is true then will run 
               // only once at the SpecificTime 
    public bool Done { get; set; } 
    public DateTime SpecificTime { get; set; } 
} 

特定の時間のアナウンスが削除されます。私はこのようなものを使用して考えていたスレッドのよう

Timer = new System.Threading.Timer(TimerCallback, null, 0, 1000); 

private void TimerCallback(object state) 
{ 
    foreach (var item in timerList) 
    { 
     // not sure how to handle the intervals of each continuous announcement 
     // some code here for the the above 

     // Not sure if this would work either because of the milliseconds etc 
     // on the DateTime 
     if (item.hasSpecificTime && !item.Done && SpecificTime == DateTime.Now) 
     { 
      SendAnnouncement(item.Announcement); 
      item.Done = true; 
     } 
    } 
} 
  • は私が必要なもののための私の実装OKですか?

  • 私は質問で言ったように、関数内のインターバルと時間をどうやって処理するのですか?正しい時間に送信するように計算する方法はわかりません。

答えて

1

あなたは

item.hasSpecificTime && !item.Done && SpecificTime <= DateTime.Now 

item.hasSpecificTime && !item.Done && SpecificTime == DateTime.Now 

を変更する必要がありそうでない場合は、あなたがするほとんどすべてのイベント。

timerListが大きくなる場合は、完了したアイテムを常に別のリストに移動して、常に多くのアイテムをループしないようにしてください。

編集
また、定期的なイベントのためにIntervalSpecificTimeを増やす必要があります。

より複雑なスキームを作成することはできますが、コードは読みやすく、理解しやすく、非常に重要です。

を最初に保った順序キューにMyTimerのインスタンスを格納する方法があります。その後、完全なリストを繰り返しポーリングするのではなく、キュー内の最初の要素までの期間にTimerCallbackをスケジュールできます。あなたは、あまりにも多くの本を持たなければなりません。キューに新しいアイテムを挿入し、そのアイテムが次に実行される(キューの最初に来る)場合は、タイマーをキャンセルして再起動する必要があります。

これはもっと優雅ですが、多くのイベントがあり、パフォーマンス上の問題がある(または1000ミリ秒の解像度が十分に細かくない)場合にのみ必要です。

+0

'timerListが大きくなると、完了したアイテムを別のリストに移動するのではなく、完了したアイテムをたくさんループさせないようにする必要があります。 5分ほど良いと思われる。 – Guapo

+0

'定期的なイベントのために間隔を指定してSpecificTimeを増やす必要があります。 'それは私がそれを考慮していなかった良い点です、当初私はSpecificTimeから完全な間隔を使用することを考えていましたが、 hasSpecificTimeとSpecificTimeのアナウンスについては、それらは一度だけ実行され、 'interval> 0 'のアナウンスは、アプリが実行されている限り実行されます。つまり、私が最初に考えていたものです。だから私は間隔が変わったので、それが走っていた時間に各発表に基づいて間隔を計算する方法がわからないのです。 – Guapo

0

ちょっとした提案:怒らないでください。しかし、この場合は、カスタムタイマーやスレッドの実装よりもはるかにクリーンでメンテナンス可能なRx operatorsを試してみてください。可能な限り実装をスレッド化する必要があります。これは、管理と保守がより複雑です。

+0

全く嫌なことはありません。私はC#プログラマーではありません。私はちょうど趣味としてのことをやっていますし、ここでそこそこのことを学び、それを改善しようとするので、すべてのアドバイスや提案などはもちろん、使用する方が良いかどうか試してみます。私が必要とする時には**のようなものを、**それを達成するためにはそれを使用することがどれほど難しいか、それとも私のスキルに基づいて**ますます) – Guapo

関連する問題