C# 线程同步

C# 线程同步,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,我有一张物品清单, 对于每个对象,我希望运行一个完全独立的线程(线程安全性),比如……我将在while循环中从列表中选择一个对象并运行一个线程,然后对于下一个对象运行下一个线程……所有线程都应同步,以便资源(值/连接(关闭/打开))他们共享的内容不应该改变….为每个对象启动线程并不一定明智;您可能应该有少量工作线程从列表中挑选项目(或者更好的是,一个队列),同步对该列表/队列的访问。可以在中找到线程安全队列的示例 一旦您有了一个工作项,就没有什么神奇的方法可以让您编写(处理)的其余代码线程安全。

我有一张物品清单, 对于每个对象,我希望运行一个完全独立的线程(线程安全性),比如……我将在while循环中从列表中选择一个对象并运行一个线程,然后对于下一个对象运行下一个线程……所有线程都应同步,以便资源(值/连接(关闭/打开))他们共享的内容不应该改变….

为每个对象启动线程并不一定明智;您可能应该有少量工作线程从列表中挑选项目(或者更好的是,一个
队列
),同步对该列表/队列的访问。可以在中找到线程安全队列的示例

一旦您有了一个工作项,就没有什么神奇的方法可以让您编写(处理)的其余代码线程安全。保持事物简单的明智方法是不变性——要么是真正的不变性(项目不能改变),要么就是简单地不改变对象。当然,您可以围绕工作项实现锁定,但这只有在all您的代码使用相同的锁定策略时才有帮助,这是很难实施的

我将从列表中选择一个对象 在while循环中运行一个线程 然后为下一个对象运行下一个 线程

如果我真的希望每个对象都有一个线程,我可能不会,我会创建一个这样的类:

class ObjectProcessingThread
{
Thread processingThread = new Thread();
public TargetObject { get; set;}

public Start()
{
    //start the processing thread with threadEntryPoint as the work the thread will do
} 

private threadEntryPoint
{
   //do stuff with targetObject
}
}
然后在while新循环中为每个对象创建一个ObjectProcessingThread,设置它的TargetObject属性,然后调用Start

所有线程都应该这样同步 该资源(值/连接) (关闭/打开))由他们共享的 不变

如果不想更改值,请不要更改它们