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



假设我有一个对象,其中包含一个不断运行的方法。 我已经创建了一个运行此方法的新线程:

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

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

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

不清楚你在问什么或你到底想实现什么,但是这里有一个使用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 时间;它表示的结果很可能 大部分时间都花在网络延迟或远程工作上(在网络上 服务器(
  • Task.Run()返回的任务实际上是说"我希望你单独执行此代码";该代码所在的确切线程 执行取决于许多因素。

请注意,Task<T>抽象对于 C# 5.

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

引用乔恩·斯基特

最新更新