线程中的异步委托

  进程线程这部分理解的不好,先记一笔吧

   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);
        }
    }
}

 

Written by

说点什么

欢迎讨论

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒