Планировщик С# HPC, задание не завершено

Я пытаюсь протестировать просто разработанный фрагмент кода на Microsoft HPC. Похоже, задание не завершает весь код. Мой метод тестирования может быть неправильным. Я просто распечатываю некоторые контрольные точки. Вот код:

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;

class S
{
    static void Main()
    {
        pcount = Environment.ProcessorCount;
        Console.WriteLine("Proc count = " + pcount);
        ThreadPool.SetMinThreads(4, -1);
        ThreadPool.SetMaxThreads(4, -1);

      //  System.Threading.Thread.Sleep(20000);

        Console.WriteLine("check point 0 ");
        t1 = new Task(A, 1);
        t2 = new Task(A, 2);
        t3 = new Task(A, 3);
        t4 = new Task(A, 4);

        Console.WriteLine("Starting t1 " + t1.Id.ToString());
        t1.Start();
        Console.WriteLine("Starting t2 " + t2.Id.ToString());
        t2.Start();
        Console.WriteLine("Starting t3 " + t3.Id.ToString());
        t3.Start();
        Console.WriteLine("Starting t4 " + t4.Id.ToString());
        t4.Start();

        //  Console.ReadLine();
    }

    static void A(object o)
    {
        Console.WriteLine("check point A ");
        B(o);
    }
    static void B(object o)
    {
        int temp = (int)o;
        Console.WriteLine("check point B ");
        if (temp == 1)
        {
            C(o);
        }
        else
        {
            F(o);
        }
    }
    static void C(object o)
    {
        Console.WriteLine("check point C ");
        D(o);
    }
    static void D(object o)
    {
        int temp = (int)o;
        Console.WriteLine("check point D " + temp);

        if (temp == 2)
        {
            F(o);
        }
        else
        {
            E(o);
        }
    }
    static void E(object o)
    {
        Console.WriteLine("check point E ");

    }
    static void F(object o)
    {
        Console.WriteLine("check point F ");
        G(o);
    }
    static void G(object o)
    {
        Console.WriteLine("check point G ");

    }



    static Task t1, t2, t3, t4;

    static int pcount;
}

В выводе задания не печатается до конца. Распечатка заканчивается случайным образом в любой точке (в случайной функции). Хорошо, я понимаю, что он может не распечатать все, так как выполнение выполняется быстрее, чем печать (возможное объяснение). Но если я попытаюсь разместить точки останова и попытаться выполнить отладку, подключившись к процессу, он попадет только в точки останова в первых частях кода. Похоже, попадание в тот же диапазон, что и тестовая распечатка. Как я могу убедиться, что код выполняется до конца, чтобы точки останова можно было сбить в любой момент?


person user2371160    schedule 23.05.2013    source источник


Ответы (1)


Task предназначен для работы в так называемом фоновом потоке. Это означает: если основной поток завершится, то завершится и фоновый поток. Поэтому, как только ваш метод Main() завершается, все потоки (и, следовательно, все задачи) завершаются, и ваша программа завершается.

Решение состоит в том, чтобы дождаться завершения ваших задач.

static void Main()
{
    pcount = Environment.ProcessorCount;
    Console.WriteLine("Proc count = " + pcount);
    ThreadPool.SetMinThreads(4, -1);
    ThreadPool.SetMaxThreads(4, -1);

  //  System.Threading.Thread.Sleep(20000);

    Console.WriteLine("check point 0 ");
    t1 = new Task(A, 1);
    t2 = new Task(A, 2);
    t3 = new Task(A, 3);
    t4 = new Task(A, 4);

    Console.WriteLine("Starting t1 " + t1.Id.ToString());
    t1.Start();
    Console.WriteLine("Starting t2 " + t2.Id.ToString());
    t2.Start();
    Console.WriteLine("Starting t3 " + t3.Id.ToString());
    t3.Start();
    Console.WriteLine("Starting t4 " + t4.Id.ToString());
    t4.Start();

    //  Console.ReadLine();

    t1.Wait();
    t2.Wait();
    t3.Wait();
    t4.Wait();
}
person Jan Dörrenhaus    schedule 23.05.2013