C#线程/锁定混乱

Sco*_*ach 6 c# multithreading locking

我有以下代码:

var items = new List<string> {"1", "2", "3"}; // 200 items
foreach(var item in items) {
  ThreadPool.QueueUserWorkItem((DoWork), item);
}

private void DoWork(object obj)
{
  lock(this)
  {
    using(var sw = File.AppendText(@"C:\somepath.txt")
    {
      sw.WriteLine(obj);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

由于线程,出于某种原因,我得到了写入文件的200个项目的随机数.60或127或有时只有3.如果我删除ThreadPool并只在原始foreach循环内写入,则所有200个项目都会成功写入.

不知道为什么会这样?

谢谢你的帮助.

Pav*_*aev 9

MSDN文档中ThreadPool的以下注释说明了这一切:

托管线程池中的线程是后台线程.也就是说,他们的IsBackground属性是真的.这意味着ThreadPool在所有前台线程退出后,线程不会保持应用程序运行.

您的应用程序只是Main在线程完成运行之前退出(到达结尾).