如何从一个对象启动两个并行线程?

时间:2018-10-19 08:17:08

标签: c# multithreading

比方说,我有一个对象,该对象的一种方法正在不断运行。 我已经创建了一个运行该方法的新线程:

new Thread(new ThreadStart(myObject.firstMethod)).Start();

现在,我想在secondMethod中有一个myObject。 请记住,由于firstMethod包含循环,因此先前终止的线程不会终止。

如何启动第二种方法?我需要创建第二个线程吗?

1 个答案:

答案 0 :(得分:2)

虽然不清楚您要问的是什么,或者您究竟想实现什么,但这是一个使用Task运行2个无穷循环(直到调用取消令牌的示例)的示例

public static void Method1(CancellationToken token)
{
      Task.Run(
         async () =>
         {
            while (!token.IsCancellationRequested)
            {
               // do something
               await Task.Delay(500, token); // <- await with cancellation
               Console.WriteLine("Method1");
            }
         }, token);
}

public static void Method2(CancellationToken token)
{
      Task.Run(
         async () =>
            {
               while (!token.IsCancellationRequested)
               {
                  // do something
                  await Task.Delay(300, token); // <- await with cancellation
                  Console.WriteLine("Method2");
               }
            }, token);
}

private static void Main(string[] args)
{
   var source = new CancellationTokenSource();  
   Method1(source.Token);
   Method2(source.Token);
   source.CancelAfter(3000);
   Console.ReadKey();
}

Demo Here


Task vs Thread differences

  

Thread是一个较低层的概念:如果您直接启动   线程,您知道它将是一个单独的线程,而不是执行   在线程池等上。

     

Task不仅仅是对“在哪里运行某些代码”的抽象   不过,这实际上只是“未来结果的希望”。所以   作为一些不同的示例:

     
      
  • Task.Delay不需要任何实际的CPU时间;就像将计时器设置为将来关闭
  •   
  • WebClient.DownloadStringTaskAsync返回的任务在本地不会花费很多CPU时间;它代表了可能   将大部分时间用于网络延迟或远程工作(在网络上   服务器)
  •   
  • Task.Run()返回的任务实际上是 ,说“我希望您分别执行此代码”;该代码的确切线程   执行取决于许多因素。
  •   
     

请注意,Task<T>抽象对于以下方面的异步支持至关重要:   C#5。

     

通常,我建议您使用更高级别的抽象   在任何可能的地方:在现代C#代码中,您几乎不需要   明确地启动自己的线程。

引用Jon Skeet