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

标签 c# .net multithreading .net-4.0 task-parallel-library

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

目前我是这样做的:

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/

相关文章:

c# - 生成 XML,内容长度不正确

c# 你的 SQL 语法有错误

javascript - 访问 aspx 页面的客户端 javascript block 中由 RegisterClientScriptBlock 注入(inject)的 javascript 代码

python - 并发访问同一个.pyc

Python:队列和线程的阻塞问题

c# - 删除字符串中最后一次出现定界符之后的字符

c# - 存储 html css javascript 的最佳数据类型

c# - 在 C# 中使用超时更改按钮的文本

.NET 正则表达式替换组内的字符

c++ - 了解并避免多线程应用程序中嵌套锁的危险