gpt4 book ai didi

c# - 任务异常长时间处于 WaitingToRun 状态

转载 作者:行者123 更新时间:2023-11-30 15:01:11 25 4
gpt4 key购买 nike

我有一个程序可以处理并行运行的各种任务。单个任务充当某种管理器,确保在运行下一个任务之前满足某些条件。但是,我发现有时任务会在 WaitingToRun 状态停留很长时间。下面是代码:

mIsDisposed = false;
mTasks = new BlockingCollection<TaskWrapper>(new ConcurrentQueue<TaskWrapper>());

Task.Factory.StartNew(() => {
while (!mIsDisposed) {
var tTask = mTasks.Take();
tTask.task.Start();
while (tTask.task.Status == TaskStatus.WaitingToRun) {
Console.WriteLine("Waiting to run... {0}", tTask.task.Id);
Thread.Sleep(200);
}
tTask.ready.Wait();
}
mTasks.Dispose();
});

DoWork();
DoWork();
DoWork();
DoWork();
DoWorkAsync();
DoWorkAsync();
DoWorkAsync();
DoWorkAsync();
DoWorkAsync();
DoWork();

TaskWrapper 的定义非常简单:

private class TaskWrapper
{
public Task task { get; set; }
public Task ready { get; set; }
}

目前只在两个地方添加了任务:

public void DoWork()
{
DoWorkAsync().Wait();
}

public Task DoWorkAsync()
{
ManualResetEvent next = new ManualResetEvent(false);

Task task = new Task(() => ActualWork(next));
Task ready = Task.Factory.StartNew(() => next.Wait());

mTasks.Add(new TaskWrapper() {
task = task,
ready = ready
});
return task;
}

ActualWork(next) 调用 next.Set() 的地方。

此队列工作并等待直到 next 被设置,然后才允许下一个工作项目继续进行。您可以通过调用 DoWork() 等待整个任务完成后再继续,也可以一次对多个任务进行排队(这些任务应该在 next 设置后运行)。

但是,当通过 DoWorkAsync() 添加任务时,在调用 tTask.task.Start() 之后,tTask.task 位于WaitingToRun 状态持续很长时间(比如 30 秒到一分钟),然后神奇地开始运行。我使用 while 循环对此进行了监控,并且 Waiting To Run... # 将显示相当长的一段时间。

调用 DoWork() 总是立即运行。我确定这与在设置为运行的任务上调用 Wait 有关。

我在这里不知所措。

更新:

我已经设法让代码正常工作,但我仍然想首先知道为什么会出现问题。

经过一些实验性更改后,我设法解决了自己的问题,但这更像是“哦,所以我不能那样做”,而不是一个很好的解决方案。原来我的问题是排队任务运行得太快。通过修改 DoWorkAsync() 以不再使用 Task.Factory.StartNew 并将 tTask.ready.Wait() 更改为 tTask。 ready.RunSynchronously 我已经设法解决了我的问题。

TaskScheduler 延迟我的任务安排是否有原因?我是否饱和了一些底层资源?这是怎么回事?

最佳答案

线程将在系统的线程池中运行。线程池始终具有最小可用线程数(参见 ThreadPool.SetMinThreads() )。如果您尝试创建多个线程,则在每个新线程启动之间将引入大约 500 毫秒的延迟。

线程池中也有最大线程数(参见 ThreadPool.GetMaxThreads() ),如果达到该限制,将不会创建新线程;它会等到旧线程结束后再调度新线程(或者更确切地说,重新调度旧线程以运行新线程,当然)。

不过您不太可能达到该限制 - 它可能超过 1000。

关于c# - 任务异常长时间处于 WaitingToRun 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14640984/

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