我可以在任务运行时更改和int值吗? C#

时间:2017-04-05 21:49:55

标签: c# parallel-processing int task

我目前正在学习如何在c#中使用Tasks,我希望能够同时运行2个任务。然后当第一个任务结束时。告诉代码停止第二个。我尝试了很多东西,但没有一个有效,我试过了:

  1. 尝试查找与task.stop相关的内容但尚未找到。我正在使用task.wait执行第一个任务,所以当第一个任务结束时,我必须做一些事情来阻止第二个任务。

  2. 由于第二个是无限的(它是一个永恒的循环)我尝试使循环的参数在主代码中可以改变,但它就像任务是一个方法,其中的变量是唯一的。

  3. 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();
    

1 个答案:

答案 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 会在每次迭代时检查取消令牌,并在请求取消时退出无限循环。