进程线程这部分理解的不好,先记一笔吧
1.一般的同步委托
运行程序时,从头到尾都只有一个线程,想:可不可以在利用一个子线程去帮我执行我的委托方法,不影响我的主线?
答案当然是可以,我们可以新建Thread类的线程,或者利用异步委托(线程池的工作者线程),不适合用新建的线程,因为它不便于管理。
所以有了异步委托,原理就是:使用了一个线程池的线程去执行了委托指向的方法。
2.异步委托的存在理由:
1)不影响主线程的执行
2)合理的利用ThreadPool线程池的线程
3)异步委托本质是调用了线程池的工作者线程,不需要为了新建和注销线程烦恼,统一由线程池管理。
3.并不是说异步委托比同步快,有时候同步比异步快,有时候异步比同步块,由具体情况决定。
上代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace _4.异步委托 { class Program { static void Main(string[] args) { //打印当前主线程 Console.WriteLine(" 主线程:" + Thread.CurrentThread.ManagedThreadId); //定义一个委托实例 Func<int, int, string> delFunc = (a, b) => { ///打印当前线程 Console.WriteLine(" 当前异步委托进程:" + Thread.CurrentThread.ManagedThreadId); return (a + b).ToString(); }; //同步调用,主线程执行 // string str = delFunc(3, 4); // Console.WriteLine(str); //异步调用委托: delFunc.BeginInvoke(3,4,null,null); Console.ReadKey(); #region 异步委托 简单方式 //拿到异步委托的结果 IAsyncResult result = delFunc.BeginInvoke(3, 4, null, null); if (result.IsCompleted) { } // endoinvoke方法会阻塞当前的线程,直到异步委托指向完成之后,才能继续往下执行。 string str = delFunc.EndInvoke(result); Console.WriteLine(str); #endregion #region 有回调函数的异步委托 //delFunc.BeginInvoke(5, 6, MyAsyncCallback, "123"); delFunc.BeginInvoke(5, 6, MyAsyncCallback, delFunc); #endregion Console.ReadKey(); } //回调函数:是异步委托方法执行完成之后,再来调 回调函数。 public static void MyAsyncCallback(IAsyncResult ar) { var del = (Func<int, int, string>)ar.AsyncState; string str = del.EndInvoke(ar); ////1、拿到异步委托执行的结果 //AsyncResult result = (AsyncResult)ar; //var del = (Func<int, int, string>)result.AsyncDelegate; //string returnValue = del.EndInvoke(result); //Console.WriteLine("返回值是:"+returnValue); ////2、拿到给回调函数的参数。 //Console.WriteLine("传给异步回调函数的参数:"+result.AsyncState); Console.WriteLine("回调函数的线程 的id是:" + Thread.CurrentThread.ManagedThreadId); } } }
说点什么
欢迎讨论