C# - 为初学者提供帮助

时间:2009-11-20 12:27:01

标签: c# multithreading

我想运行三个线程(i)一个应该将字符串附加到文件中。(ii)另一个线程应该从写入的流中删除特殊字符。(iii)第三个线程应该按升序对单词进行排序。如何我能以线程安全(同步)的方式做到吗?

我的意思是

线程1

sample.txt

Apple
Ma#22ngo
G@ra&&pes

线程2 (删除特殊字符sample.txt后)

Apple
Mango
Grapes

线程3(sample.txt)

Apple
Grapes
Mango

3 个答案:

答案 0 :(得分:5)

为什么要使用多个线程执行此操作?也许您的示例过于简单,但如果您可以避免线程,那么这样做 - 看起来这个问题不需要它。

你有很多文件,或者一个非常大的文件,还是其他什么?你为什么不能一个接一个地执行这三个动作呢?

<强>更新

我觉得我至少应该尝试帮助你解决你所面临的根本问题。我认为您需要将您正在考虑的任务视为管道。你从字符串开始,删除特殊字符(清理),然后将它们写入文件。当你最终编写了所有字符串时,你需要对它们进行排序。

直到排序阶段的所有事情都可以并且应该由单个线程完成。读取字符串,清理它,将其写入文件,移动到下一个字符串。在将所有字符串干净地写入文件之前,排序的最后任务不会轻易发生。

如果您要编写和排序的文件很多,那么每个文件都可以由一个单独的线程来处理,但我会避免在处理任何一个给定文件时涉及多个线程。

答案 1 :(得分:2)

我会在写入文件之前删除特殊字符,在同一个线程中执行操作1和2。操作3不能与其他操作并行运行,因为在写入文件时,您无法读取和排序。所以基本上这些操作都是顺序的,将它们放入不同的线程是没有意义的。

答案 2 :(得分:0)

您应该实现ThredSafe队列(或使用Parallels扩展附带的队列)。

线程有共享信息的问题所以,即使理论上你的解决方案被视为一个完美的并行场景,现实是你不能让线程自由访问共享数据,因为当你这样做时,不好事情发生了。

相反,您可以使用同步机制,在本例中为ConcurrentQueue。这样你就会有这个:

ConcurrentQueue<string> queueStrings;
ConcurrentQueue<string> queueFile;

Thread1将字符串插入queueStrings队列。

Thread2从queueString中读取字符串,处理它们,然后将它们插入到queueFile队列中。

最后,Thread3从queueFile读取已处理的字符串并将其写入文件。