C#和多线程逻辑

本文关键字:多线程 | 更新日期: 2023-09-27 18:21:43

我要做的是创建一个函数,读取文件的所有内容并正则表达式。到目前为止,我所做的是创建一个函数

read_content(字符串文件名);

但在这个功能之前,我要求用户选择一个目录,然后读取中存在的所有文件名

DirectoryInfo dir = new DirectoryInfo(dirPath);
foreach (FileInfo file in dir.GetFiles())
{
save in array
}

我已经启动了一个线程

 var t = new Thread(() => read_content(filename));
  t.Start();

这一切都很好,现在我想让它多线程,现在它的单线程

我希望用户输入类似于启动10个线程的命令,这些线程一次读取一个文件ultil到达结束

我试着在谷歌上搜索,但找不到我需要的东西,我不想要整个代码,只是告诉我逻辑或一些基本代码,想在我自己的上学习和编码

编辑:似乎我对线程池有更多的投票权,所以如果能链接到好的教程,将不胜感激

C#和多线程逻辑

您可以使用任务并行库。

你不应该手动设置线程中的数量——你应该让系统来处理这个问题。TPL为你做这件事,所以只要创建任务,它们最终就会被执行。通常,每个核心执行一个任务(但不确定)。

你的代码可能是这样的:

DirectoryInfo dir = new DirectoryInfo(dirPath);
foreach (FileInfo file in dir.GetFiles()) {
    var filename = file.FullName;
    new Task(() => {
        read_content(filename);
    }).Start();
}

注意:您的代码不会在线程完成时进行检查,所以我也没有包含这一点。如果你想要这样做,你必须将任务保存在一个列表中,并检查任务是否已经完成。

您可以使用ThreadPool类并在每个文件上调用File.ReadAlltext(:

使用

ThreadPool.QueueUserWorkItem(<method>, <obj_arg>);

这将重用线程,并且不会为每个文件创建线程。您可以在foreach的末尾执行Join。

thread.Join();

您是否考虑过使用C#5 的异步功能