gpt4 book ai didi

c# - 使用 Task.StartNew 方法时如何保证创建新线程

转载 作者:可可西里 更新时间:2023-11-01 08:02:12 26 4
gpt4 key购买 nike

据我所知,我有误导性信息。我需要在后台运行一个单独的线程。

目前我是这样做的:

var task = Task.Factory.StartNew
(CheckFiles
, cancelCheckFile.Token
, TaskCreationOptions.LongRunning
, TaskScheduler.Default);//Check for files on another thread

private void CheckFiles()
{
while (!cancelCheckFile.Token.IsCancellationRequested)
{
//do stuff
}
}

这总是为我创建一个新线程。然而,经过多次讨论,即使它被标记为 LongRunning 也不能保证会创建一个新线程。

过去我做过这样的事情:

thQueueChecker = new Thread(new ThreadStart(CheckQueue));
thQueueChecker.IsBackground = true;
thQueueChecker.Name = "CheckQueues" + DateTime.Now.Ticks.ToString();
thQueueChecker.Start();


private void CheckQueue()
{
while (!ProgramEnding)
{
//do stuff
}
}

你会建议我回到这种方法来保证使用新线程吗?

最佳答案

默认任务调度程序 ThreadPoolTask​​Scheduler 确实总是为长时间运行的任务创建一个新线程。如您所见,它不使用线程池。这与您自己创建线程的手动方法没有什么不同。理论上,.NET 4.5 的线程调度程序可能会做一些不同的事情,但实际上它不太可能改变。

protected internal override void QueueTask(Task task)
{
if ((task.Options & TaskCreationOptions.LongRunning) != TaskCreationOptions.None)
{
new Thread(s_longRunningThreadWork) { IsBackground = true }.Start(task);
}
else
{
bool forceGlobal =
(task.Options & TaskCreationOptions.PreferFairness) != TaskCreationOptions.None;
ThreadPool.UnsafeQueueCustomWorkItem(task, forceGlobal);
}
}

关于c# - 使用 Task.StartNew 方法时如何保证创建新线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8039936/

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