【发布时间】: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