在C#.net中通过多线程读取文本文件数据

在C#.net中通过多线程读取文本文件数据,c#,multithreading,console,C#,Multithreading,Console,我正在阅读由6列组成的文本文件。在6列中,每3列显示一个对象信息,我希望通过多线程并行访问这些列。像一个对象的3列一样,除了主线程之外,总共创建了2个线程。 文本文件如下所示: 我试过了,但在将数据从主线程传递到其他线程时遇到了困难。字符串变量“part”出现错误。(当前上下文中不存在可变部分) 我想对tag1和tag2执行多线程处理 我正在分享我的代码块,请告诉我哪里错了 因为我是多线程编程的新手 namespace MultiTag_Simulation_ConsoleApp { c

我正在阅读由6列组成的文本文件。在6列中,每3列显示一个对象信息,我希望通过多线程并行访问这些列。像一个对象的3列一样,除了主线程之外,总共创建了2个线程。 文本文件如下所示:
我试过了,但在将数据从主线程传递到其他线程时遇到了困难。字符串变量“part”出现错误。(当前上下文中不存在可变部分)

我想对tag1和tag2执行多线程处理

我正在分享我的代码块,请告诉我哪里错了 因为我是多线程编程的新手

namespace MultiTag_Simulation_ConsoleApp
{
    class Program
    {    
      static void Main(string[] args)
       {
          string line;
          string[] part;

        StreamReader File = new StreamReader("2Tags_Points.txt");

        while((line = File.ReadLine()) !=null)
        {
            part = line.Split('\t');
            Thread TAG1 = new Thread(new ThreadStart(Tag1));
            TAG1.Start();
        }
    }

    void Tag1()
    {
        double w, x;
        w = Convert.ToDouble(part[1]);
        x = Convert.ToDouble(part[2]);

        Console.WriteLine("Tag1 x:" + w + "\t" + "Tag1 y:" + x);
        Console.ReadKey();
    }
  }
}

谢谢大家抽出时间。我在线程同步方面弄错了。现在我解决了这个问题,将“part”变量初始化为主线程上方的静态变量

 static string [] part 

您的解决方案虽然可以编译,但仍然有很多隐藏的问题。例如,您需要同步对共享变量的访问,而现在,如果您这样做,将无法实现拥有多个线程的目的。我建议使用一个更简单的框架,这将为您实现多线程,因为多线程很难正确实现,但是如果您将困难的事情留给框架,那么使用多个处理器处理您的工作负载就容易多了

例如,这将并行计算您的内容。虽然只是每行并行,而不是每标记并行,但只要所有处理器都得到最佳使用,这真的不重要

namespace MultiTag_Simulation_ConsoleApp
{
    using System;
    using System.IO;
    using System.Linq;
    using System.Threading.Tasks;

    internal static class Program
    {
        internal static void Main()
        {
            Parallel.ForEach(
                File.ReadLines("2Tags_Points.txt").Select(line => line.Split('\t')),
                parts =>
                    {
                        var w = Convert.ToDouble(parts[1]);
                        var x = Convert.ToDouble(parts[2]);
                        Console.WriteLine("Tag1 x:" + w + "\t" + "Tag1 y:" + x);

                        var y = Convert.ToDouble(parts[4]);
                        var z = Convert.ToDouble(parts[5]);
                        Console.WriteLine("Tag2 x:" + y + "\t" + "Tag2 y:" + z);
                    });
        }
    }
}

“请告诉我哪里错了,因为我是多线程编程新手”我想你首先错了,多线程在这里很有帮助。请注意,创建线程意味着您的开销可能比线程本身的计算更大。其次,您错误地创建了两个线程。实际上,每行创建2个线程。当Tag1和Tag2处理零件数组时,主线程会更改零件数组的内容。您需要将零件作为单独的参数发送到每个线程。是的,我想将“part”值共享给这两个线程,但是我不能,因为我在主线程之外创建了这两个线程。请告诉我如何在这两个线程中使用“part”变量值。但正如我所说的,在这种情况下,没有多线程可能会更好。创建和启动线程是非常昂贵的,这就是循环使用线程的方式。此外,正确的线程管理也很困难。更好的方法是创建工作包,即
File.ReadLines(文件名)。选择many(line=>{var parts=line.Split('\t');返回新的[]{new{Tag=parts[0],X=parts[1],Y=parts[2]},新的{Tag parts[3],X=parts[4],Y=parts[5]};})
并将其作为
Parallel.Foreach
的输入,这将为您完成所有的线程管理和负载平衡。感谢@nvoigt为您提供的时间和回复。。。事实上,我必须在未来做100个标签。。。这就是我想做多线程的原因。在这种情况下,多线程是更好的方法吗@SN25我认为你应该在一个正常的循环中编程,首先要有正确的结果。因为正确的节奏很快。如果你认为没有足够快地达到结果,那就寻找优化的方法。“一百个”的东西听起来并不像处理器会充分使用它的第一个核心,但这取决于你的衡量和决定。