委托,线程,同步,异步的学习(一)

线程这块一直没怎么去看过,今晚就来研究了下,委托与事件有一篇已经说过了,这里就不说了,主要研究委托和线程。委托主要有以下几个知识点:
一:什么是委托
二:什么时候用委托
三:多播委托
四:同步调用委托
五:异步调用委托
六:什么是线程池

针对问题点一:
简单来说,委托就是将方法当作参数进行传递
百度百科:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递
哈哈,其实差不多.
声明方式与类声明方式类似。
这个问题点就不贴代码了,下面会有,一看就明白.
问题点二:
搜索了很多资源,发现各种各样的说法,其实意思都一样:
委托,将方法当作参数传递,那么什么时候需要将方法当作参数传递呢?
比如:你要写一个类,但是你不知道你需要调用那个对象的方法,这时候就该用委托了.
为什么这样说?比如你要在某个时刻完成某件事情,但是具体过程你不知道,只有调用的人才知道.这时候就用个委托,告诉调用方面,你需要在这个时刻实现某个过程去完成这件事.

或者你想要新建一个线程,这时候除了考虑thread还可以用委托.,

再比如:
现在要对一系列数据进行排序,而排序算法可能比较复杂,我不会自己写,我想调用Array.Sort方法,微软为我们提供了快速排序算法。
但是这里有一个问题——我要实现自定义排序规则,比如对于字符串,默认的是按字母顺序,但现在我想这样排序:

按字符串长度排序,只有当长度不同时,再按字母排序。

显然,微软不可能提供这样“个性”的排序方法,那是不是说,就必须让我们自己去写快速排序算法呢?
不需要!
我们只需要使用委托,就能实现这个要求:
string[]strs=”I like C# very much”.Split();
Array.Sort(strs,Rule);
int void Rule(string first,string second)
{
return first.Length==second.Length?first.CompareTo(second):first.Length.CompareTo(second.Length);
}

显然,我并不需要知道快速排序算法的逻辑,我只需要告之排序规则,就实现了我的个性排序。
第三个问题点:
如果我既想要普通的sort和别的B方法怎么办,我只要用+=就行,这样就实现了方法sort和方法B自动执行,这就是多路广播.
第四个问题点:
委托有两种调用方式,同步和异步
同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行。基本相当于直接去调用方法。(事件除外)。
这里就有两种写法了,

 static void Main(string[] args)
        {
            myDelegate d1 = new myDelegate(add);
            IAsyncResult asr = d1.BeginInvoke(10000, myIAsyncResult, d1);//异步调用委托
            Console.WriteLine("我是主线程,我继续做别的事情");
            if (!asr.IsCompleted)//判断异步(子线程)是否完成
            {
                Console.WriteLine("d1执行完成了");
            }
            if (!asr.AsyncWaitHandle.WaitOne(500))//通过等待句柄的时间进行判断是否完成
            {
                Console.WriteLine("WaitHandle");
            }
            int result = d1.EndInvoke(asr);
            Console.ReadKey();


        }
        public static int add(int ms)
        {
            Thread.Sleep(ms);
            Console.WriteLine("等待10000,执行完成");
            return ms;
        }
        static void myIAsyncResult(IAsyncResult asr)//回调方法
        {
            Console.WriteLine("I am IAsyncResult 回调");
        }

这两种写法是一样的.

问题五:
异步调用:异步请求一般用在IO等耗时操作上,他的好处是函数调用立即返回,相应的工作线程立即返还给系统以供重用(线程池见问题六).
实质就是新开了一个子线程.这样就可以提高运行速度.
准确的说:异步委托在系统线程池中,而不是自定义的线程池。
用BeginInvoke 和EndInvoke

 static void Main(string[] args)
        {
            myDelegate d1 = new myDelegate(add);
            IAsyncResult asr=d1.BeginInvoke(10000, null, null);
            Console.WriteLine("我是主线程,我继续做别的事情");
            int result = d1.EndInvoke(asr);
            Console.ReadKey();


        }
        public static int add(int ms)
        {
            Thread.Sleep(ms);
            Console.WriteLine("等待10000,执行完成");
            return ms;
        }

从代码来看,同步的调用就一句话,异步的是两句,一个是调用,一个接收回调值,那么异步就写在接收回调值之前,这样不会干扰主线程,假如你写在了回调之后,那么跟同步调用就没什么区别了.
问题六:
线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程。线程池中线程的数量通常完全取决于可用内存数量和应用程序的需求。然而,增加可用线程数量是可能的。线程池中的每个线程都有被分配一个任务,一旦任务已经完成了,线程回到池子中并等待下一次分配任务。
此篇文章根据以下链接的内容整理总结而成。
为什么用委托:http://bbs.csdn.net/topics/300001907
异步调用委托:http://www.xuebuyuan.com/108180.html
异步调用的本质:http://bbs.csdn.net/topics/90202984
线程池:http://www.cnblogs.com/Leo_wl/archive/2012/03/27/2418997.html
还有百度百科。

你可能感兴趣的:(c#)