x秒ごとにいくつかの機能を開始したいと思います。しかし、関数を再度開始する前に、関数が完了するまで待ちたくありません。タイマーを 5 秒に設定して開始functionX()
し、5 秒経過しても完了しないとします =>新しいスレッドで再度functionX()
開始したいとします。functionX()
また、関数のグループが同時に開始されることも望んでいます。
System.Threading.Timer
それが私が使用しなければならないと思った理由ですParallel
。短い例を書いてみましょう。
class Program
{
private static System.Threading.Timer timer;
private static int interval = 2000;
static void Main(string[] args)
{
Console.WriteLine("go");
Run();
Console.WriteLine("end");
Console.ReadKey();
}
private static void Run()
{
timer = new System.Threading.Timer(TimerCallback, null, 0, interval);
}
private static void TimerCallback(Object o) {
Parallel.Invoke(() => FunctionA(), () => FunctionB(), () => FunctionC());
}
private static void FunctionA()
{
Console.WriteLine("A");
}
private static void FunctionB()
{
Console.WriteLine("B");
}
private static void FunctionC()
{
Console.WriteLine("C");
}
}
これでいいですか?助言がありますか?このコードが何らかの形で間違っている場合でも、出力について別の質問をしたいと思います。このコードを開始すると、次のような出力が得られます。
go
end
A
B
C
C
A
B
C
A
B
C
B
A
うーん。最初の出力go
は問題ありませんがend
、なぜ 2 番目の出力は , ではないA
のB
でしょC
うか? そして、出力A、B、Cが最初の出力ランダムの後に何らかの形であるというのは正常ですか?
私が理解していない次の問題:行を削除すると、 Console.ReadKey();
出力が表示されません。
static void Main(string[] args)
{
Console.WriteLine("go");
Run();
Console.WriteLine("end");
}
つまり、コンソールは起動していますが、数ミリ秒後に閉じられ、再び開かれません。しかし、A、B、C を何度も呼び出しているため、表示されるはずなので、新しいコンソールが何度も表示されるはずです。何か案は?ありがとうございました