Основы параллельного программирования с использованием Visual Studio 2010

Отладка многопоточного приложения с использованием окна задач

Показывать лекцию целиком
  • Создадим новое консольное приложение в Visual Studio, с названием "ParralelTaskApllication": (рис 23.1)
  • Скопируем, заранее созданный код, в проект:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Diagnostics;
    namespace ParralelTaskApllication
    {
        class XClass
        {
            public void MA(object param) { MB(param); }
            public void MB(object param) { MC(param); }
            object s1 = new object();
            object s2 = new object();
            public void MC(object param)
            {
                if (param == "1")
                {
                    MD();
                }
                if (param == "2")
                {
                    ME();
                }
                if (param == "3")
                {
                    MF();
                }
            }
            public void MD()
            {
                ME();
            }
            public void ME()
            {
                while (true) Thread.SpinWait(int.MaxValue / 20);
            }
            public void MF()
            {
                ML();
            }
            public void MG(object param)
            {
                MH(param);
            }
            public void MH(object param)
            {
                MI(param);
            }
            public void   MI(object  param)
            {
                if (param == "4")
                {
                    MJ();
                }
                else
                {
                    MK();
                }
            }
            public void MJ()
            {
                Monitor.Enter(s1); Thread.SpinWait(int.MaxValue / 20); Monitor.Enter(s2);
            }
            public void MK()
            {
                Monitor.Enter(s2); 
                Thread.SpinWait(int.MaxValue / 10);
                Monitor.Enter(s1);
            }
            public void ML()
            {
                MM();
            }
            public void MM()
            {
                while (true) 
                { Thread.SpinWait(int.MaxValue / 3);
                  Debugger.Break();
                };
            }
        }
        class Program
        {
            static XClass obj = null;
            static void Main(string[] args)
            {
                obj = new XClass();
                Task.Factory.StartNew(obj.MA, "1"); 
                Task.Factory.StartNew(obj.MA, "2"); 
                Task.Factory.StartNew(obj.MA, "3");
                Task.Factory.StartNew(obj.MG, "4"); 
                Task.Factory.StartNew(obj.MG, "5");
                Console.ReadLine();
            }
        }
    }
  • Запустите отладку программы с помощью кнопки "Start Debbuging" из меню Visual Studio - "Debug" или с помощью клавиши "F5": (рис 23.2)
  • Через несколько секунд "Курсор отладки" должен остановиться на методе Debbuger.Break(): (рис 23.3)
  • Запустите окно параллельных задач (Parallel Task) из меню "Debug -> Windows" или с помощью сочетания клавиш "Ctrl+Shift+D,K": (рис 23.4)
  • Откроется окно параллельных задач (Parallel Task): (рис 23.5)

    В данном окне, по каждой запущенной задачи можно увидеть: уникальный идентификатор задачи, имя потока, который запускает задача, ее расположение.

  • Для того, что бы "заморозить" выполнение конкретного потока, щелкните на нужном потоке в списке - правой кнопкой мыши и выберите пункт "Freeze Assigned Thread": (рис 23.6)

    Напротив потока должен отобразиться соответствующий значок:

    (рис 23.7)

    Если поток "замораживается", то он не будет выполняться при проходе по коду после текущей точки останова.

  • Для перехода на нужный поток используется пункт меню "Switch To Task". При этом программа перейдет на участок кода соответствующий данному потоку. В нашем случае метод с ID = 2 соответствует методу public void ME(): (рис 23.8)
  • Для завершения процесса отладки используется пункт из меню "Debug" - "Stop Debugging" или сочетание клавиш "Shift+F5": (рис 23.9)
  • Вернуться к учебному плану