簡體   English   中英

為單個任務創建多個線程

[英]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)); 
        } 
    } 
}

_tasksConcurrentDictionary<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM