【问题标题】:Reading Text file data through Multi threading in C#.net在 C#.net 中通过多线程读取文本文件数据
【发布时间】:2018-05-27 01:07:13
【问题描述】:

我正在阅读由 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();
    }
  }
}

【问题讨论】:

  • “请告诉我我哪里弄错了,因为我是多线程编程的新手” 我认为你首先错了,多线程在这里有帮助。请注意,创建线程意味着您的开销可能比它们本身的计算更糟糕。其次,您错误地创建了两个线程。实际上,您每行创建 2 个线程。
  • 当 Tag1 和 Tag2 处理零件数组时,主线程更改零件数组的内容。您需要将零件作为单独的参数发送到每个线程。请chek
  • 是的,我想将“part”值共享给这两个线程,但我不能,因为我在主线程之外创建了这两个线程。请建议我如何在这两个线程中使用“部分”变量值
  • ParametierizedThreadStart。但正如我所说 - 在这种情况下,如果没有多线程,你可能会更好。
  • 创建和启动线程非常昂贵,例如任务线程被回收的方式。正确的线程管理也很困难。更好的方法是创建工作包,即File.ReadLines(filename).SelectMany(line => { var parts = line.Split('\t'); return new[] { new { Tag = parts[0], X = parts[1], Y = parts[2] }, new { Tag = parts[3], X = parts[4], Y = parts[5] }}; }),并将其用作Parallel.Foreach 的输入,这将为您完成所有线程管理和负载平衡。

标签: c# multithreading console


【解决方案1】:

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

 static string [] part 

【讨论】:

    【解决方案2】:

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

    例如,这将并行计算您的内容。虽然只是每行并行,而不是每个标签,但只要优化使用所有处理器,这真的没关系。

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

    【讨论】:

    • 感谢@nvoigt 的时间和回复...实际上,我将来必须为 100 个标签执行此操作...这就是我想做多线程的原因。在这种情况下,多线程是更好的方法吗? ——
    • @SN25 我认为您应该首先在正常循环中对其进行编程并获得正确的结果。因为正确的节奏很快。如果您认为结果不够快,只有在寻找优化它的方法。 “一百”的东西听起来不像处理器甚至会充分利用它的第一个核心,但这取决于你衡量然后决定。
    猜你喜欢
    • 1970-01-01
    • 2019-06-02
    • 2013-06-09
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 2015-09-11
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多