Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中生成工作线程并在主线程中处理其输出?_C#_Multithreading_Task Parallel Library - Fatal编程技术网

如何在C#中生成工作线程并在主线程中处理其输出?

如何在C#中生成工作线程并在主线程中处理其输出?,c#,multithreading,task-parallel-library,C#,Multithreading,Task Parallel Library,我想在C#控制台应用程序中实现以下功能: 在主线程中生成多个工作线程 每个工作线程处理数据并定期向主线程发送字符串消息 主线程处理消息并等待所有工作线程完成 主线程退出 现在我正在使用TPL,但我不知道如何将消息从工作线程发送到主线程。谢谢你的帮助 我会将工作线程包装到它们自己的Func或常规方法中,并将IEnumerable作为它们的返回类型。然后,我将为在Func/方法上调用foreach的每个工作者创建一个任务,并处理他们的消息 下面是一个使用两种常规方法的简单示例。如果这些方法是任意的,

我想在C#控制台应用程序中实现以下功能:

  • 在主线程中生成多个工作线程
  • 每个工作线程处理数据并定期向主线程发送字符串消息
  • 主线程处理消息并等待所有工作线程完成
  • 主线程退出

  • 现在我正在使用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