假设我有一个对象,其中包含一个不断运行的方法。 我已经创建了一个运行此方法的新线程:
new Thread(new ThreadStart(myObject.firstMethod)).Start();
现在,我有一个secondMethod
myObject
我想开始。 请记住,先前的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# 代码中,您很少需要 显式启动自己的线程。
引用乔恩·斯基特