gpt4 book ai didi

c# - 为单个任务创建多个线程

转载 作者:行者123 更新时间:2023-11-30 21:14:12 26 4
gpt4 key购买 nike

我帮助为 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在不同的线程上执行 2 次——即 backgroundTask.Run()被调用两次。 RunTimer只被调用一次。 NumberOfSecondsToWait是 60。我已经验证了 tplTasks只有 2 个项目。

有人知道吗?

最佳答案

这是因为 lambda(特别是 newTask lambda)绑定(bind)到变量,而不是值。

你需要:

...
foreach (var backgroundTask in backgroundTasks)
{
var localBackgroundTask = backgroundTask;
var newTask = new Task(() => localBackgroundTask.Run());
...
}
...

关于c# - 为单个任务创建多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6387887/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com