比方说,我有一个对象,该对象的一种方法正在不断运行。 我已经创建了一个运行该方法的新线程:
new Thread(new ThreadStart(myObject.firstMethod)).Start();
现在,我想在secondMethod
中有一个myObject
。
请记住,由于firstMethod
包含循环,因此先前终止的线程不会终止。
如何启动第二种方法?我需要创建第二个线程吗?
答案 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();
}
Thread
是一个较低层的概念:如果您直接启动 线程,您知道它将是一个单独的线程,而不是执行 在线程池等上。
Task
不仅仅是对“在哪里运行某些代码”的抽象 不过,这实际上只是“未来结果的希望”。所以 作为一些不同的示例:
Task.Delay
不需要任何实际的CPU时间;就像将计时器设置为将来关闭- 由
WebClient.DownloadStringTaskAsync
返回的任务在本地不会花费很多CPU时间;它代表了可能 将大部分时间用于网络延迟或远程工作(在网络上 服务器)Task.Run()
返回的任务实际上是 ,说“我希望您分别执行此代码”;该代码的确切线程 执行取决于许多因素。请注意,
Task<T>
抽象对于以下方面的异步支持至关重要: C#5。通常,我建议您使用更高级别的抽象 在任何可能的地方:在现代C#代码中,您几乎不需要 明确地启动自己的线程。