我目前正在学习如何在c#中使用Tasks,我希望能够同时运行2个任务。然后当第一个任务结束时。告诉代码停止第二个。我尝试了很多东西,但没有一个有效,我试过了:
尝试查找与task.stop相关的内容但尚未找到。我正在使用task.wait执行第一个任务,所以当第一个任务结束时,我必须做一些事情来阻止第二个任务。
由于第二个是无限的(它是一个永恒的循环)我尝试使循环的参数在主代码中可以改变,但它就像任务是一个方法,其中的变量是唯一的。
TL; DR:我想知道我是否可以更改任务中的参数,以便从代码之外停止它。任务本身是否采取任何参数?我可以在开始运行后在主代码中更改它们吗?
如果之前的事情都不可能,那么它是否有可能以任何方式停止无限任务?
CODE:
Task a = new Task(() =>
{
int sd = 3;
while (sd < 20)
{
Console.Write("peanuts");
sd++; //this i can change cuz its like local to the task
}
});
a.Start();
// infinite task
Task b = new Task(() =>
{
int s = 3; // parameter i want to change to stop it
while (s < 10)
{
Console.Write(s+1);
}
});
b.Start();
a.Wait();
// Now here I want to stop task b
Console.WriteLine("peanuts");
Console.ReadKey();
答案 0 :(得分:0)
试试这个:
public static void Run()
{
CancellationTokenSource cts = new CancellationTokenSource();
Task1(cts);
Task2(cts.Token);
}
private static void Task2(CancellationToken token)
{
Task.Factory.StartNew(() =>
{
int s = 3; // parameter i want to change to stop it
while (!token.IsCancellationRequested)
{
Console.Write(s + 1);
}
}, token);
}
private static void Task1(CancellationTokenSource cts)
{
Task.Factory.StartNew(() =>
{
int sd = 3;
while (sd < 20)
{
Console.Write("peanuts");
sd++; //this i can change cuz its like local to the task
}
}).ContinueWith(t => cts.Cancel());
}
Task1 完成后, CancellationTokenSource
将被取消。因此, Task2 会在每次迭代时检查取消令牌,并在请求取消时退出无限循环。