作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
据我所知,我有误导性信息。我需要在后台运行一个单独的线程。
目前我是这样做的:
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
}
}
你会建议我回到这种方法来保证使用新线程吗?
最佳答案
默认任务调度程序 ThreadPoolTaskScheduler
确实总是为长时间运行的任务创建一个新线程。如您所见,它不使用线程池。这与您自己创建线程的手动方法没有什么不同。理论上,.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/
嘿。本周的一个教程,其中一个问题要求通过使用其他函数 formatLine 和 formatList 创建一个函数 formatLines,以格式化行列表。 我的代码是这样的; type Line =
我是一名优秀的程序员,十分优秀!