所以这是我一直在努力的事情。我不是编码器所以我无法调试以找出问题所在。我正在使用一个允许变量的程序,可以将C#的片段输入到程序中。有两个问题,我使用的文件是 test.txt 。该程序运行25个线程。我想从 test.txt 获取98行,但我不希望任何两个线程采用相同的行。我从朋友那里得到了以下代码,似乎有效。我只想确认代码是否正确。现在我需要做的是为此代码添加一个新规则。 { - Project.Directory-} accounts.xls 中有一个文件。每行有一个帐户。问题在于多线程,它从 accounts.xls 获取两次相同的帐户,因此我收到错误,因为一次只允许来自一个帐户的一个请求。我希望每个线程只能使用一个帐户,因此两个线程不可能使用相同的帐户,并且两个线程也不可能从 test.txt 中获取相同的行。我只是想尽可能提高效率。我被告知需要锁定,但我不理解C#。有人可以帮忙吗?
IList<string> list = project.Lists["Domain Format List"];
lock (SyncObjects.InputSyncer)
{
string[] result = FileSystem.FileGetLines(@"{-Project.Directory-}test.txt","0- 97",true,false);
foreach (string results in result)
{
list.Add(results);
}
}
编辑: test.txt 不是100行,它包含90k行,我想从它获取98行,这就是它需要被锁定的原因。 accounts.xls还包含50行
答案 0 :(得分:1)
从文件中读取行不应该是多线程的,特别是如果文件中只有~100行。另一方面,如果单独处理每一行需要花费大量时间,您可以考虑并行化操作。
最简单的方法是使用ParallelEnumerable
扩展方法来处理行:
var processedResults = File.ReadLines(@"path-to-file.txt")
.AsParallel()
.Select(line => Process(line))
.ToList();
其中Process
是一个方法,它采用单个string
行并执行“长时间运行操作”来处理它:
private static ProcessedData Process(string input)
{
// get ProcessedData from input
}
请注意,AsParallel
会将IEnumerable<string>
转换为ParallelQuery<string>
,这意味着Select
和ToList
允许线程安全并行处理(假设您Process
1}}方法对于多线程是安全的,或者更好的是无状态的。)
如果Process
方法是无状态的,则不需要任何其他同步构造(即lock
s)。