通过C#.net

时间:2017-12-13 07:53:33

标签: c# multithreading console

我正在阅读由6列组成的文本文件。在6列中,每3列显示一个对象信息,我希望通过多线程并行访问这些列。像一个对象的3列一样,除主线程外总共创建了2个线程。 文本文件如下所示:Text file Image
我尝试了但是我遇到了将数据从主线程传递到其他线程的困难,错误发生在字符串变量“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();
    }
  }
}

2 个答案:

答案 0 :(得分:1)

感谢大家,感谢您的时间。我在线程同步中犯了错误。现在我通过将“part”变量初始化为主线程上方的静态变量来解决问题。

 static string [] part 

答案 1 :(得分:0)

您的解决方案虽然可以编译,但仍然存在许多隐藏的问题。例如,你现在需要同步对共享变量的访问,如果你这样做,它将失去拥有多个线程的目的。我建议使用一个更简单的框架,它会为你做多线程,因为多线程很难做到正确,但是当你把困难的东西留给框架时,使用多个处理器为你的工作负载更容易。

例如,这将并行计算您的东西。尽管每行并行,但不是每个标签,但只要所有处理器都以最佳方式使用,它就没关系。

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);
                    });
        }
    }
}