首页 > 解决方案 > 如何从一个对象启动两个并行线程?

问题描述

假设我有一个对象,该对象具有一种不断运行的方法。我已经创建了一个运行此方法的新线程:

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

现在,我有一个我想开始的secondMethodmyObject请记住,先前启动的线程不会终止,因为firstMethod它包含一个循环。

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

标签: c#multithreading

解决方案


它有点不清楚你在问什么或者你到底想要实现什么,但是这里是一个使用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();
}

在这里演示


任务与线程差异

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

Task不仅仅是“在哪里运行一些代码”的抽象——它实际上只是“对未来结果的承诺”。所以作为一些不同的例子:

  • Task.Delay不需要任何实际的 CPU 时间;这就像设置一个计时器在未来关闭
  • 返回的任务WebClient.DownloadStringTaskAsync在本地不会占用太多 CPU 时间;它代表的结果可能大部分时间都花在网络延迟或远程工作(在 Web 服务器上)
  • Task.Run()真正返回的任务说“我希望你单独执行这段代码”;该代码执行的确切线程取决于许多因素。

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

一般来说,我建议您尽可能使用更高级别的抽象:在现代 C# 代码中,您应该很少需要显式启动自己的线程。

引用Jon Skeet


推荐阅读