如何在C#中生成工作线程并在主线程中处理其输出?
我想在C#控制台应用程序中实现以下功能:如何在C#中生成工作线程并在主线程中处理其输出?,c#,multithreading,task-parallel-library,C#,Multithreading,Task Parallel Library,我想在C#控制台应用程序中实现以下功能: 在主线程中生成多个工作线程 每个工作线程处理数据并定期向主线程发送字符串消息 主线程处理消息并等待所有工作线程完成 主线程退出 现在我正在使用TPL,但我不知道如何将消息从工作线程发送到主线程。谢谢你的帮助 我会将工作线程包装到它们自己的Func或常规方法中,并将IEnumerable作为它们的返回类型。然后,我将为在Func/方法上调用foreach的每个工作者创建一个任务,并处理他们的消息 下面是一个使用两种常规方法的简单示例。如果这些方法是任意的,
现在我正在使用TPL,但我不知道如何将消息从工作线程发送到主线程。谢谢你的帮助 我会将工作线程包装到它们自己的
Func
或常规方法中,并将IEnumerable
作为它们的返回类型。然后,我将为在Func
/方法上调用foreach
的每个工作者创建一个任务,并处理他们的消息
下面是一个使用两种常规方法的简单示例。如果这些方法是任意的,您需要创建一个列表
static void Main(字符串[]args)
{
var task1=Task.Factory.StartNew(()=>{foreach(varn在Back1(13))Console.WriteLine(“从Back1开始,说“+n”);});
var task2=Task.Factory.StartNew(()=>{foreach(varn在Back2(5))Console.WriteLine(“从Back2开始,说“+n”);});
task1.等待();
任务2.等待();
控制台。写入线(“全部完成”);
Console.ReadLine();
}
静态IEnumerable Back1(int-it)
{
for(int i=0;i
您可以在TPL中使用生产者/消费者模式,如中所示
或者,你可以用老式的方式踢它,然后使用信号,看
或者,如果您希望在非常低的级别上工作,请将Monitor.Pulse
与Monitor.WaitOne
一起使用(如所示)
无论哪种方式,您都在寻找同步,您可以在上面阅读
如果您实际上不关心更新在哪个线程上运行,那么另一个选项是将委托作为参数,并在那里打印更新,即:
static Task<string> ReadFile(string filename, Action<string> updateStatus)
{
//do stuf synchronously
return Task<string>.Factory.StartNew(() => {
System.Threading.Thread.Sleep(1000);
//do async stuff
updateStatus("update message");
//do other stuff
return "The result";
});
}
public static void Main(string[] args)
{
var getStringTask = ReadFile("File.txt", (update) => {
Console.WriteLine(update)
});
Console.Writeline("Reading file...");
//do other stuff here
//getStringTask.Result will wait if not complete
Console.WriteLine("File contents: {0}", getStringTask.Result);
}
“更新消息”
调用控制台。WriteLine
仍将出现在线程池
线程上,但它仍可能满足您的需要
static Task<string> ReadFile(string filename, Action<string> updateStatus)
{
//do stuf synchronously
return Task<string>.Factory.StartNew(() => {
System.Threading.Thread.Sleep(1000);
//do async stuff
updateStatus("update message");
//do other stuff
return "The result";
});
}
public static void Main(string[] args)
{
var getStringTask = ReadFile("File.txt", (update) => {
Console.WriteLine(update)
});
Console.Writeline("Reading file...");
//do other stuff here
//getStringTask.Result will wait if not complete
Console.WriteLine("File contents: {0}", getStringTask.Result);
}
Reading file...
update message
File contents: The result