c#并行/多线程一段时间

c#并行/多线程一段时间,c#,multithreading,C#,Multithreading,我在谷歌上搜索了一些例子,但我没有真正找到我需要的东西 我有一个while循环: StreamReader ImportFile = new StreamReader(@"c:\users\matthew\desktop\test.txt"); string line; while ((line = ImportFile.ReadLine()) != null) { doneTotal++; string[] info = line.Split('-'); string u

我在谷歌上搜索了一些例子,但我没有真正找到我需要的东西

我有一个while循环:

StreamReader ImportFile = new StreamReader(@"c:\users\matthew\desktop\test.txt");

string line;
while ((line = ImportFile.ReadLine()) != null)
{
   doneTotal++;

   string[] info = line.Split('-');
   string username = info.Length >= 1 ? info[0] : null;
   string file = info.Length >= 2 ? info[1] : null;

   myfunc(username, file);
}
所以,myfunc很快,但对我来说还不够快。如何并行或多线程处理这个while循环


谢谢。

凭直觉,试试这个。首先,添加一个新类来表示
myfunc
的一组参数。(它甚至可以是
Tuple

然后修改原始方法,如下所示:

StreamReader ImportFile = new StreamReader(@"c:\users\matthew\desktop\test.txt");

string line;
var filesToProcess = new List<MyFuncParameters>();
while ((line = ImportFile.ReadLine()) != null)
{
    doneTotal++;

    string[] info = line.Split('-');
    string username = info.Length >= 1 ? info[0] : null;
    string file = info.Length >= 2 ? info[1] : null;

    filesToProcess.Add(new MyFuncParameters {File = file, UserName = username});
}

foreach (var fileToProcess in filesToProcess)
{
    myfunc(fileToProcess.UserName, fileToProcess.File);
}
StreamReader ImportFile=newstreamreader(@“c:\users\matthew\desktop\test.txt”);
弦线;
var filesToProcess=new List();
而((line=ImportFile.ReadLine())!=null)
{
doneTotal++;
string[]info=line.Split('-');
字符串用户名=info.Length>=1?信息[0]:空;
字符串文件=info.Length>=2?info[1]:空;
添加(新的MyFuncParameters{File=File,UserName=UserName});
}
foreach(filesToProcess中的var fileToProcess)
{
myfunc(fileToProcess.UserName,fileToProcess.File);
}
换句话说,首先从一个文件中读取所需的所有内容,然后,如果您正在迭代另一个文件列表(从原始文件创建),则接下来执行该操作。通过不读取一个文件,然后在读取原始文件之间使用另一个文件执行操作(
myfunc
),您可能会看到性能有所提高

那是猜测。这很可能取决于
myfunc
的具体功能,因为您指出这是速度较慢的部分


正如注释中所述,您可以启动任意多个并行线程来读取文件,但一次只能有一个线程从磁盘读取文件,因此这实际上没有任何好处。它甚至可以使它变慢。

我以为我在另一个答案中发布了这个,但我没有看到它


您是否可以修改您正在向服务器发布的内容,这样您就可以发布一个集合,而不是发布大量具有一个用户名和一个文件名的请求?一个(或多个)大请求将比许多小请求快得多。处理每一项都需要相同的时间,但您消除了进行所有单独调用的开销。

我很确定,进程中缓慢的是I/O。您无法通过多线程I/O来获得更好的性能。只需将整个文件作为一个字符串读入,并分别处理每一行。难道您不能读入所有行,然后在并行foreach中迭代它们吗?您可以使用它来构建异步管道。或者使用
tasks.Add(Task.Factory.StartNew(()=>myFunc(用户名,文件));/*…*/Task.WaitAll(任务)
如果您使用多线程实现这一点,它将不会对您有所帮助,因为瓶颈不在于CPU的计算。这段代码中缓慢的部分是从硬盘读取数据,因此并行实现对您没有帮助。好的。是的,@Kalten的想法是正确的。您应该用您在
myfunc
StreamReader ImportFile = new StreamReader(@"c:\users\matthew\desktop\test.txt");

string line;
var filesToProcess = new List<MyFuncParameters>();
while ((line = ImportFile.ReadLine()) != null)
{
    doneTotal++;

    string[] info = line.Split('-');
    string username = info.Length >= 1 ? info[0] : null;
    string file = info.Length >= 2 ? info[1] : null;

    filesToProcess.Add(new MyFuncParameters {File = file, UserName = username});
}

foreach (var fileToProcess in filesToProcess)
{
    myfunc(fileToProcess.UserName, fileToProcess.File);
}