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