暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

面试必备:聊聊C#中委托中的同步和异步

DotNet开发跳槽 2021-08-05
2293

简述:


    1、委托的同步调用通过Invoke来实现。

        Invoke同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行。

    2、委托的异步调用通过BeginInvoke和EndInvoke来实现。

         委托的异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行。


案例:

委托的同步方法 委托的Invoke方法用来进行同步调用,代码如下:

     static void Main(string[] args)
    {
    //无参数方法
         Action action = () => Console.WriteLine("action方法执行");
         action.Invoke();
    //有一个参数(多个参数基本相同)
         Action<string> action2 = (t) => Console.WriteLine("action方法执行,{0}", t);
         action2.Invoke("我在测试");
    //带一个参数带返回值
         Func<int, bool> func = (t) => {
    int i = new Random().Next(1, 10);
    Console.WriteLine("随机数是{0}", i);
    return i > t;
    };
    bool b = func.Invoke(5);
         Console.WriteLine("{0}",b);
    Console.Read();
    }

    同步调用会阻塞线程,若是是要调用一项繁重的工做(如大量IO操做),可能会让程序停顿很长时间,形成糟糕的用户体验,这时候异步调用就颇有必要了。

    委托的异步调用测试

    异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程能够继续执行。委托的异步调用经过BeginInvoke和EndInvoke来实现,代码如下:

        static void Main(string[] args)
      {
      //无参数方法
      Action action = () => Console.WriteLine("action方法执行");


      action.BeginInvoke(null,null);


      //有一个参数(多个参数基本相同)
      Action<string> action2 = (t) => Console.WriteLine("action方法执行,{0}", t);


      action2.BeginInvoke("我是个测试",null,null);


      //带一个参数带返回值
      Func<int, bool> func = (t) => {


      int i = new Random().Next(1, 10);
      Console.WriteLine("随机数是{0}", i);
      return i > t;
      };
      var result = func.BeginInvoke(5,null,null);


      bool b = func.EndInvoke(result);


      Console.WriteLine("{0}",b);


      Console.Read();
      }

      异步回调

      用回调函数,当调用结束时会自动调用回调函数,解决了为等待调用结果,而让线程依旧被阻塞的局面。

        static void Main(string[] args)
        {
        //无参数方法
             Action action = () => Console.WriteLine("action方法执行");
        AsyncCallback callback1 = t =>
        {
        Console.WriteLine("我是回调1");
             };
             action.BeginInvoke(callback1, null);
        //有一个参数(多个参数基本相同)
        Action<string> action2 = (t) => Console.WriteLine("action方法执行,{0}", t);
        AsyncCallback callback2 = t =>
        {
        Console.WriteLine("我是回调2");
        };
             action2.BeginInvoke("我是个测试", callback2, null);
        //带一个参数带返回值
             Func<int, bool> func = (t) => {
        int i = new Random().Next(1, 10);
        Console.WriteLine("随机数是{0}", i);
                 return i > t;
        };
        AsyncCallback callback3 = t =>
        {
        Console.WriteLine("我是回调3");
        };
             var result = func.BeginInvoke(5, callback3, null);
             bool b = func.EndInvoke(result);
             Console.WriteLine("{0}",b);
        Console.Read();
        }

        引用:https://www.cnblogs.com/yangxi1081/p/9634678.html

        版权申明:本文来源于网友收集或网友提供,仅供学习交流之用,如果有侵权,请转告版主或者留言,本公众号立即删除。


        支持小微:

        腾讯云 搞活动了?玩服务器的可以搞搞。就这几天时间。

        轻量  1C2G6M 60GB SSD盘297元/3年

        链接:https://curl.qcloud.com/bR8ycXZa


        右下角,您点一下在看图片

        小微工资涨1毛

        商务合作QQ:185601686







        文章转载自DotNet开发跳槽,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论