Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C获取副本时的锁定问题_C#_Multithreading - Fatal编程技术网

C# C获取副本时的锁定问题

C# C获取副本时的锁定问题,c#,multithreading,C#,Multithreading,所以这是我挣扎了一段时间的事情。我不是一个程序员,所以我无法调试以找出问题所在。我正在使用一个允许变量的程序,可以将C代码片段输入到程序中。有两个问题,我使用的是test.txt文件。该程序运行25个线程。我想从test.txt中获取98行,但我不希望任何两个线程获取相同的行。我已经从一个朋友那里得到了下面的代码,它似乎可以工作。我只是想确认代码是否正确。现在我需要做的是在代码中添加一条新规则。{-Project.Directory-}accounts.xls中有一个文件。每行有一个帐户。问题是

所以这是我挣扎了一段时间的事情。我不是一个程序员,所以我无法调试以找出问题所在。我正在使用一个允许变量的程序,可以将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行

从文件中读取行不应设置为多线程,尤其是当文件中只有约100行时。另一方面,如果单独处理每一行需要花费大量的时间,可以考虑并行化操作。 最简单的方法是使用可并行枚举的扩展方法来处理行:

var processedResults = File.ReadLines(@"path-to-file.txt")
    .AsParallel()
    .Select(line => Process(line))
    .ToList();
其中Process是一种方法,它采用单个字符串行并执行长时间运行的操作来处理它:

private static ProcessedData Process(string input)
{
    // get ProcessedData from input
}
请注意,AsParallel将IEnumerable转换为ParallelQuery,这意味着Select和ToList允许线程安全的并行处理,前提是您的进程方法对多线程或更好的无状态是安全的


如果进程方法是无状态的,则不需要任何额外的同步构造,即锁。

@Alberto如果编辑,也可以删除,谢谢。你的所有线程都会在锁行阻塞,这意味着没有多线程。好的,我删除了感谢,我还是新来的。在格罗。多线程仍然可以工作,看起来它没有重复行,但现在我需要锁定accounts.xls,所以如果您理解我的意思,它只从中获取一行?锁定意味着它将阻止任何其他线程访问花括号之间的代码。@user3194329:它没有重复行,因为只有一行一次线程处理文件。这意味着您也可以使用单个线程。你应该重新措辞这个问题。指定您试图完成的内容,即您试图对这些行执行的操作。使用多个线程来读取一个100行的文件是没有意义的,您可以使用file.ReadAllLines一次性读取,并且不会比这更快。一旦您一次性加载了它们,如果处理速度相对较慢,您可以选择使用多个线程来处理它们。