在我的程序中,我需要处理文件。我的程序可以使用多个线程来处理文件,因此我需要某种锁定,因为每个文件不应该被多个线程一次处理。
private object lockObj = new object();
public void processFile(string file)
{
lock(lockObj)
{
//... actuall processing
}
}
使用上面的代码,一次只能处理一个文件,但是两个线程应该能够一次处理两个不同的文件,但不能处理相同的文件。
我的第一个想法是创建一个字典,其中键是文件,而值是锁对象。 但我想知道是否也可以锁定字符串文件?有什么想法吗?
PS:很抱歉找不到更好的头衔
答案 0 :(得分:4)
我的第一个想法是创建一个字典,其中键是文件,而值是锁对象。但我想知道是否也可以锁定字符串文件?有什么想法吗?
如果在运行时创建字符串,则锁定字符串将不安全。最好制作一个对象字典,然后用它来锁定。
话虽这么说,你应该考虑在这本词典中使用ConcurrentDictionary<string,object>
,因为它可以防止词典中的竞争条件(或其他锁定)。通过使用GetOrAdd,您可以安全地获取用于锁定的适当对象。
话虽如此,但这里可能采用不同的方法。您可以使用ConcurrentQueue
或BlockingCollection
来提供要处理的项目列表,然后使用固定数量的线程处理它们。这样可以防止首先出现同步问题。
答案 1 :(得分:2)
我认为你正以错误的方式接近这一点。您只需使用BlockingCollection的生产者 - 消费者模式即可。一个线程不断读取文件并将它们放入队列(使用Add
),并且一堆工作线程继续从队列中取出(使用Take
)并处理文件。实现队列的方式保证两个线程无法检索同一个文件,因此不需要显式锁定。
答案 2 :(得分:0)
如果您正在使用c#中的线程,那么您应该检查任务并行库(TPL)。这是一个学习曲线,但是一旦掌握了它,您的多线程代码将更简单,更易于维护。
Here's an example完全符合您使用TPL的要求。