私は、ASP.NET Webサイトのバックグラウンドタスクシステムの作成を手伝ってくれました。複数のスレッドを1つのタスク用に作成しました。
これはこれはルートTask
から呼び出されTask
Task.Factory.RunNew(RunTimer);
私のルートです。
private void RunTimer()
{
while (!cancellationToken.IsCancellationRequested)
{
var backgroundTasks = _tasks.Values.ToArray();
var tplTasks = new List<Task>();
foreach (var backgroundTask in backgroundTasks)
{
var newTask = new Task(() => backgroundTask.Run());
tplTasks.Add(newTask);
newTask.Start();
}
Task.WaitAll(tplTasks.ToArray());
for (int i = 0; i < NumberOfSecondsToWait &&
!cancellationToken.IsCancellationRequested; i++)
{
Thread.Sleep(new TimeSpan(0, 0, 1));
}
}
}
_tasks
ConcurrentDictionary<string, IBackgroundTask>
です。何らかの理由でnewTask
が別のスレッドで2回実行されます。つまり、backgroundTask.Run()
が2回呼び出されます。 RunTimer
は一度だけ呼び出されます。 NumberOfSecondsToWait
は60です。tplTasks
には2つのアイテムしかありません。
誰でもご存知ですか?
問題は何ですか?私には思われるbackgroundTask.Run()は、_tasks内のすべてのタスクに対して呼び出されます。また、睡眠のために使用する必要があります:System.Threading.Thread.Sleep(NumberOfSecondsToWait * 1000) – MrFox
それは2つのスレッドを作成します。一番早い時期にそれをやめようとしています。 –