効率的な方法で、定義済みの時間に数十万の関数を実行する必要があります。
私が現在持っているコードは次のようなものです:
class myclass
{
public DateTime NextTime = DateTime.Now;
Random rand = new Random();
public void DoStuff()
{
if (NeedToWork())
{
// do some complex stuff on a 2nd thread.
NextTime = DateTime.Now.AddSeconds(rand.Next(60, 3600));
}
}
public bool NeedToWork()
{
return DateTime.Now > NextTime;
}
}
タイマーから実行される呼び出し関数:
static List<myclass> mylist = new List<myclass>();
static void Activator()
{
foreach (var item in mylist)
{
item.DoStuff();
}
}
私の問題は、コレクションにアイテムの割り当てがあり、それらすべてを処理するのに非常に長い時間がかかり、場合によっては一部の DoStuff() 関数が 1 分以上遅れて実行されることです。
現在、「Activator」関数は、遅延時間をできるだけ短くするために、異なるスレッドから同時に呼び出されます (必要なスレッド同期は、 を使用して処理されますMutex
) 。
私が考えた2つの解決策:
- を 1 つ持つ代わりに、1 秒の精度で
List<myclass>
のような辞書を作成Dictionary<DateTime, List<myclass>>
し、1 秒ごとに適切なクラス オブジェクトを実行すると、辞書は「nexttime」を「myclass」インスタンスにマッピングします。 List<>
1 つのリストの代わりに 2 つの s またはs を作成しますQueue<>
。それらは 'fastqueue' および 'slowqueue' という名前になります。slowqueue にはすべてのオブジェクトが含まれ、fastqueue にはすぐに作業が必要になるすべての項目が含まれ、専用のスレッドが作成されます。スローキューをループし、残り時間を確認してファストキューに入れます。
ノート:
実際のコードには、次の実行時間を決定するランダム データはありません。実際には何らかの計算に基づいています。これは単なるサンプルです。
1 つのアイテムの実行には 1 秒もかからず、1 時間に最大 4 回しか実行されません。すべてのコードがここに表示されているわけではありませんが、RAM と CPU のパワーは問題ではありません。
- CPU 時間を浪費しているのは、return DateTime.Now > NextTime という行だけです。