c#并行/多线程一会儿
本文关键字:一会儿 多线程 并行 | 更新日期: 2023-09-27 17:53:46
我在google上搜索了一些例子,但是我没有找到我需要的东西。
我有这个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<string, string>
)。
public class MyFuncParameters
{
public string UserName { get; set; }
public string File { get; set; }
}
然后像这样修改你的原始方法:
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);
}
换句话说,首先从一个文件中读取所需的所有内容,然后如果要遍历另一个文件列表(从原始文件创建),则下一步执行该操作。如果不读取一个文件,然后在读取原始文件之间对另一个文件执行一些操作(myfunc
),您可能会看到性能有所提高。
那是猜测。这很可能取决于myfunc
到底做了什么,因为你指出这是慢的部分。
正如评论中所述,您可以启动尽可能多的并行线程来读取文件,但是一次只有一个线程可以真正从磁盘读取,所以它没有任何好处。
我以为我把这个贴在我的另一个答案里了,但是我没有看到。
你能修改你发布到服务器的内容,这样你就可以发布一个集合而不是一个用户名和一个文件名的大量请求了吗?一个(或几个)大的请求比很多小的请求要快得多。每个项都需要同样的时间来处理,但是您消除了进行所有单独调用的开销。