最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中一些你可能沒用過的調(diào)試窗口的方法

 更新時間:2013年05月13日 15:08:09   作者:  
其他窗口比較常用,就不介紹了,是不是有一些你沒用到的窗口呢?

首先說明:如果沒有進入調(diào)試模式的話,默認的調(diào)試窗口如下:

image

開始前的準備:

新建控制臺程序DebugWindowDemo:

修改Program.cs 的代碼為:

復(fù)制代碼 代碼如下:

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

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

            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)
        {
            B(o);
        }
        static void B(object o)
        {
            C(o);
        }
        static void C(object o)
        {
            int temp = (int)o;

            Interlocked.Increment(ref aa);
            while (aa < 4)
            {

            }

            if (temp == 1)
            {
                // BP1 - all tasks in C

                Debugger.Break();
                waitFor1 = false;
            }
            else
            {
                while (waitFor1)
                {

                }
            }
            switch (temp)
            {
                case 1:
                    D(o);
                    break;
                case 2:
                    F(o);
                    break;
                case 3:
                case 4:
                    I(o);
                    break;
                default:
                    Debug.Assert(false, "fool");
                    break;
            }
        }
        static void D(object o)
        {
            E(o);
        }
        static void E(object o)
        {
            // break here at the same time as H and K

            while (bb < 2)
            {

            }
            //BP2 - 1 in E, 2 in H, 3 in J, 4 in K

            Debugger.Break();
            Interlocked.Increment(ref bb);

            //after

            L(o);
        }
        static void F(object o)
        {
            G(o);
        }
        static void G(object o)
        {
            H(o);
        }
        static void H(object o)
        {
            // break here at the same time as E and K

            Interlocked.Increment(ref bb);
            Monitor.Enter(mylock);
            while (bb < 3)
            {

            }
            Monitor.Exit(mylock);


            //after

            L(o);
        }
        static void I(object o)
        {
            J(o);
        }
        static void J(object o)
        {
            int temp2 = (int)o;

            switch (temp2)
            {
                case 3:
                    t4.Wait();
                    break;
                case 4:
                    K(o);
                    break;
                default:
                    Debug.Assert(false, "fool2");
                    break;
            }
        }
        static void K(object o)
        {
            // break here at the same time as E and H

            Interlocked.Increment(ref bb);
            Monitor.Enter(mylock);
            while (bb < 3)
            {

            }
            Monitor.Exit(mylock);


            //after

            L(o);
        }
        static void L(object oo)
        {
            int temp3 = (int)oo;

            switch (temp3)
            {
                case 1:
                    M(oo);
                    break;
                case 2:
                    N(oo);
                    break;
                case 4:
                    O(oo);
                    break;
                default:
                    Debug.Assert(false, "fool3");
                    break;
            }
        }
        static void M(object o)
        {
            // breaks here at the same time as N and Q

            Interlocked.Increment(ref cc);
            while (cc < 3)
            {

            }
            //BP3 - 1 in M, 2 in N, 3 still in J, 4 in O, 5 in Q

            Debugger.Break();
            Interlocked.Increment(ref cc);
            while (true)
                Thread.Sleep(500); // for ever

        }
        static void N(object o)
        {
            // breaks here at the same time as M and Q

            Interlocked.Increment(ref cc);
            while (cc < 4)
            {

            }
            R(o);
        }
        static void O(object o)
        {
            Task t5 = Task.Factory.StartNew(P, TaskCreationOptions.AttachedToParent);
            t5.Wait();
            R(o);
        }
        static void P()
        {
            Console.WriteLine("t5 runs " + Task.CurrentId.ToString());
            Q();
        }
        static void Q()
        {
            // breaks here at the same time as N and M

            Interlocked.Increment(ref cc);
            while (cc < 4)
            {

            }
            // task 5 dies here freeing task 4 (its parent)

            Console.WriteLine("t5 dies " + Task.CurrentId.ToString());
            waitFor5 = false;
        }
        static void R(object o)
        {
            if ((int)o == 2)
            {
                //wait for task5 to die

                while (waitFor5) { ;}


                int i;
                //spin up all procs

                for (i = 0; i < pcount - 4; i++)
                {
                    Task t = Task.Factory.StartNew(() => { while (true);});
                    Console.WriteLine("Started task " + t.Id.ToString());
                }

                Task.Factory.StartNew(T, i + 1 + 5, TaskCreationOptions.AttachedToParent); //scheduled

                Task.Factory.StartNew(T, i + 2 + 5, TaskCreationOptions.AttachedToParent); //scheduled

                Task.Factory.StartNew(T, i + 3 + 5, TaskCreationOptions.AttachedToParent); //scheduled

                Task.Factory.StartNew(T, i + 4 + 5, TaskCreationOptions.AttachedToParent); //scheduled

                Task.Factory.StartNew(T, (i + 5 + 5).ToString(), TaskCreationOptions.AttachedToParent); //scheduled


                //BP4 - 1 in M, 2 in R, 3 in J, 4 in R, 5 died

                Debugger.Break();
            }
            else
            {
                Debug.Assert((int)o == 4);
                t3.Wait();
            }
        }
        static void T(object o)
        {
            Console.WriteLine("Scheduled run " + Task.CurrentId.ToString());
        }
        static Task t1, t2, t3, t4;
        static int aa = 0;
        static int bb = 0;
        static int cc = 0;
        static bool waitFor1 = true;
        static bool waitFor5 = true;
        static int pcount;
        static S mylock = new S();
    }


F5,開始運行:

由于Debugger.Break();

所以當執(zhí)行到這里的時候,Debugger會中斷。

這個時候再看看調(diào)試窗口會發(fā)現(xiàn)多了幾個窗口:

image

點擊調(diào)試->窗口->并行任務(wù),界面如下:

image

按下F5,繼續(xù)運行:

image 

雙擊查看相應(yīng)等待的任務(wù),就可以知道這個工作線程為什么等待了。

例如:

image

繼續(xù)按F5,運行,你應(yīng)該會看到:

image

總之關(guān)于當前運行的并行任務(wù)你都可以看的到。

關(guān)閉程序,重新F5,進入調(diào)試模式

選擇調(diào)試->窗口->并行堆棧

可以看到:

image

其中藍線代表當前正在執(zhí)行的線程。

如果右鍵點擊方法視圖的S.C ,可以看到右鍵菜單如下:image

點擊切換方法視圖

image

可以看到:

image

關(guān)閉程序,重新F5,進入調(diào)試模式

點擊調(diào)試->窗口->線程:

可以看到:

image

當前控制臺的所有線程都在這里。

在線程上點擊右鍵可以凍結(jié)線程:

image

凍結(jié)線程也就是Pause線程,

凍結(jié)的線程可以被解凍,也就是Resume。

其他的窗口:

調(diào)試->窗口->模塊:可以看到當前程序加載的所有模塊。

image

調(diào)試->窗口->進程:

image

調(diào)試->窗口->反匯編:

image

調(diào)試->窗口->寄存器:

image

調(diào)試->窗口->調(diào)用堆棧:

調(diào)用堆棧窗口是比較常用的窗口:

image

上圖表示先調(diào)用A方法,接著B方法,接著C方法。

也可以認為是C方法是B調(diào)用,而B方法是A調(diào)用的。

其他窗口比較常用,就不介紹了,是不是有一些你沒用到的窗口呢?

相關(guān)文章

  • C#調(diào)用接口的四種方式介紹

    C#調(diào)用接口的四種方式介紹

    這篇文章介紹了C#調(diào)用接口的四種方式,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • 詳解c# 可空類型(Nullable)

    詳解c# 可空類型(Nullable)

    這篇文章主要介紹了c# 可空類型(Nullable)的相關(guān)資料,文中示例代碼非常詳細,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • string與stringbuilder兩者的區(qū)別

    string與stringbuilder兩者的區(qū)別

    今天小編就為大家分享一篇關(guān)于string與stringbuilder兩者的區(qū)別,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • C#將部分Controls數(shù)據(jù)導(dǎo)入對象并存入ini中的操作方法

    C#將部分Controls數(shù)據(jù)導(dǎo)入對象并存入ini中的操作方法

    在Winform設(shè)計中,經(jīng)常需要將控件數(shù)據(jù)導(dǎo)出到屬性或字段中,本文詳細介紹了如何優(yōu)化這一過程,包括控件和屬性的遍歷,以及使用FieldInfo的getSet函數(shù)和Ini類庫來實現(xiàn)數(shù)據(jù)的有效存儲和轉(zhuǎn)換,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • C#關(guān)閉指定名字進程的方法

    C#關(guān)閉指定名字進程的方法

    這篇文章主要介紹了C#關(guān)閉指定名字進程的方法,涉及C#進程操作的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 對WPF中的TreeView實現(xiàn)右鍵選定

    對WPF中的TreeView實現(xiàn)右鍵選定

    這篇文章介紹了WPF實現(xiàn)右鍵選定TreeView的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • c#常用表格控件dataGridView的分頁顯示

    c#常用表格控件dataGridView的分頁顯示

    最近項目需要自己寫了一個用來給DataGridView分頁用的控件,下面這篇文章主要給大家介紹了關(guān)于c#常用表格控件dataGridView的分頁顯示,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • C#實現(xiàn)實體類和XML相互轉(zhuǎn)換

    C#實現(xiàn)實體類和XML相互轉(zhuǎn)換

    這篇文章主要為大家詳細介紹了C#實現(xiàn)實體類和XML相互轉(zhuǎn)換的資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • c#實現(xiàn)flv解析詳解示例

    c#實現(xiàn)flv解析詳解示例

    本文提供的解析程序簡單的把FLV分解了出來,如果要做FLV的修改操作的話,可以給每個類加個toStream方法,再歷遍依次調(diào)用就可以寫回到文件里了
    2014-01-01
  • C#實現(xiàn)操作windows系統(tǒng)服務(wù)(service)的方法

    C#實現(xiàn)操作windows系統(tǒng)服務(wù)(service)的方法

    這篇文章主要介紹了C#實現(xiàn)操作windows系統(tǒng)服務(wù)(service)的方法,可實現(xiàn)系統(tǒng)服務(wù)的啟動和停止功能,非常具有實用價值,需要的朋友可以參考下
    2015-04-04

最新評論

云林县| 建宁县| 普定县| 丰台区| 荃湾区| 潼关县| 乌兰浩特市| 博爱县| 巩留县| 长葛市| 芦山县| 务川| 巴南区| 乐东| 潍坊市| 高雄县| 镇沅| 新昌县| 聊城市| 松桃| 渭南市| 商南县| 夏河县| 五寨县| 禄劝| 云南省| 锡林郭勒盟| 沙洋县| 郁南县| 手游| 扎囊县| 湟中县| 绥阳县| 孝感市| 鄂托克旗| 青龙| 鲜城| 西林县| 蒲城县| 安远县| 余姚市|