[英]Multiple threads created for single Task
我幫助為ASP.NET網站創建了后台任務系統。
這是我的根本Task
Task.Factory.RunNew(RunTimer);
這是從根Task
調用的。
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
在單獨的線程上執行兩次-即backgroundTask.Run()
被調用兩次。 RunTimer
僅被調用一次。 NumberOfSecondsToWait
是60。我已經驗證tplTasks
只有2個項目。
有人知道嗎
這是因為lambda(尤其是newTask
lambda)綁定到變量,而不是值。
你需要:
...
foreach (var backgroundTask in backgroundTasks)
{
var localBackgroundTask = backgroundTask;
var newTask = new Task(() => localBackgroundTask.Run());
...
}
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.