1.是多线程
2.不是
3.BeginInvoke由线程池处理,具体有几个线程要看运行时
4.自己写Thread不受线程池管理,理论上和BeginInvoke有区别,不过你的委托很简单应该看不出区别

解决方案 »

  1.   

    判断是不是多线程很简单。在你的方法内加上:
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
    在Main里面也加上。如果一致,就是一个线程,不一致,就是多个线程。
      

  2.   

    3ks very much~ 结贴,同时也感谢一楼的回复 :)
      

  3.   

    版主,用Thread.CurrentThread.ManagedThreadId是否有点问题?我将循环次数从10逐步修改到10w,都显示同一个线程。
      

  4.   

    版主,用Thread.CurrentThread.ManagedThreadId是否有点问题?我将循环次数从10逐步修改到10w,都显示同一个线程。
    对啊,不是多线程,你以为呢。你要是要用多线程,需要用Task或者Thread
      

  5.   

    在for循环内,用Task.CurrentId获取也都是相同的(id都是空)
      

  6.   

    版主,用Thread.CurrentThread.ManagedThreadId是否有点问题?我将循环次数从10逐步修改到10w,都显示同一个线程。
    对啊,不是多线程,你以为呢。你要是要用多线程,需要用Task或者Thread
    尴尬,还以为是多线程的。我还顺便把1楼给感谢了,真是悲催。
      

  7.   

    你害惨我了,Action.BeginInvoke()不是多线程。希望以后回复要把准确性放在第一位,真的。一个帖子,可能再N年以后,还会有其他的后继者看到,并且以此为范本记忆在脑海中,却是一个错误。该有多悲催。
      

  8.   

    我就呵呵了,敢不敢贴代码
    using System;
    using System.IO;
    using System.Threading;
    using System.Linq;public static class Program
    {
    static void Doing(int i)
    {
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
    Console.WriteLine(i.ToString());
    }
        public static void Main(String[] args)
        {
            try
            {
                for (int i = 0; i < 10; i++)
                {
                    //代码A
                    Action<int> action = new Action<int>(Doing);
                    action.BeginInvoke(i, null, null);
                }
      
                Console.WriteLine("循环结束...");
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine(ex.ToString());
            }
        }
    }输出
    自己看MSDN怎么说:使用异步方式调用同步方法
      

  9.   

    自己看MSDN怎么说:使用异步方式调用同步方法
    赞。以程序为准。
      

  10.   

    自己看MSDN怎么说:使用异步方式调用同步方法
    大哥,你试试再打印线程那行前面随便加些东西,比如aaa之类的,然后拼接当前线程Id试试。
      

  11.   

    自己看MSDN怎么说:使用异步方式调用同步方法
    大哥,你试试再打印线程那行前面随便加些东西,比如aaa之类的,然后拼接当前线程Id试试。
    你想表达什么?
    另外,主线程也就是执行For循环的线程一般是ID1
      

  12.   

    Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
    当前线程id碰巧在1-10之间,正好跟打印i的值(也在1-10之间)混在一起,你还怎么区分哪个是线程的id?但是你把它换成:Console.WriteLine(“aaa : ”+Thread.CurrentThread.ManagedThreadId);
    即使你循环10000次,仍然是同一个。
      

  13.   

    谢谢iyomumx,也谢谢lz的问题。
      

  14.   

    我晕,你放在Doing方法内打印的线程。在Doing内,确实不一样。在for循环内,是一样的。
      

  15.   

    给帖子加了100分。记得结贴的时候全部结给iyomumx。
      

  16.   

    晕了,被版主忽悠了。
    iyomumx是对的,正确的检测方法确实应该放在Doing方法内。这说明Action.BeginInvoke确实是多线程。
      

  17.   

    嗯。多谢iyomumx,多谢版主。iyomumx,在此表示抱歉。你确实是对的。
      

  18.   

    晕倒。最后发现是我自己的疏忽,理解错了。
    版主是让在方法内加的,我自己没看仔细,就放在了for循环内。我的错。我的错。万分抱歉,两位。今晚这这几个小时,学习了。向两位作揖,拜谢!结贴。
      

  19.   

    我认为for循环是线性执行这件事情应该是常识。如果你希望并行执行for循环,请使用Parallel.For方法。但这个时候BeginInvoke就没有必要出现了。
      

  20.   

    最后总结下吧。
    9楼iyomumx的仍然可判断出线程的Id,即使没有添加前缀。因为有数字重复,可作为依据。这是我的错误之一。
    版主在开头即明确告知,在方法内,加上获取线程Id的方法,我自己疏忽,放在了for循环内。这是我的错误之二。
    有两位传道授业解惑的师者给了方法,我盲目的进行测试,没有理性、仔细的进行分析处理。这是我的错误之三。希望后来者,在看到这篇帖子时,注意下这个总结。也希望自己以后不要再干这样的蠢事。
    最后深深的感谢iyomumx,感谢。感谢斑竹在最近几篇帖子中的回复。感谢。
      

  21.   

    我认为for循环是线性执行这件事情应该是常识。如果你希望并行执行for循环,请使用Parallel.For方法。但这个时候BeginInvoke就没有必要出现了。
    单纯for直接打印数字的话,是线性。如果去掉直接打印,改用Action.BeginInvoke,应该属于并行了吧。当然Parallel.For是并行的,这个我用过。我用BeginInvoke的主要目的是想知道,此方法是否为多线程。
      

  22.   

    用委托做的异步是交给线程池处理,肯定是多线程,不过你循环十次样本太小,根本不会开到十个工作线程,线程池已经轻松搞定了。线程池的只有当接收到新任务,且所有线程都在阻塞或者忙碌时才会激活新线程。
    手动写10个Thread和扔十个任务跟线程池其实执行过程是不一样的,因为线程池线程都是默认后台线程,且有任务队列调配。
      

  23.   

      static void Doing(int i)
            {
                Console.WriteLine(i.ToString());
            }
    里面可以加个sleep 随机阻塞几百ms
    这样玩起多线程 才会清楚一点.