zoukankan      html  css  js  c++  java
  • 艾伟_转载:C# 委托的同步调用和异步调用 狼人:

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

      同步调用的例子:

    using System;
    using System.Threading;
    public delegate int AddHandler(int a, int b);
    public class Foo {
    static void Main() {
    Console.WriteLine(
    "**********SyncInvokeTest**************");
    AddHandler handler
    = new AddHandler(Add);
    int result = handler.Invoke(1,2);
    Console.WriteLine(
    "Do other work ... ... ...");
    Console.WriteLine(result);
    Console.ReadLine();
    }
    static int Add(int a, int b) {
    Console.WriteLine(
    "Computing "+a+" + "+b+" ...");
    Thread.Sleep(
    3000);
    Console.WriteLine(
    "Computing Complete.");
    return a+b;
    }
    }
    运行结果:
    **********SyncInvokeTest**************
    Computing 1 + 2 ...
    Computing Complete.
    Do other work... ... ...
    3

      同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕
      的用户体验,这时候异步调用就很有必要了。
      异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行。
      委托的异步调用通过BeginInvoke和EndInvoke来实现。

    异步调用:

    using System;
    using System.Threading;
    public delegate int AddHandler(int a, int b);
    public class Foo {
    static void Main() {
    Console.WriteLine(
    "**********AsyncInvokeTest**************");
    AddHandler handler
    = new AddHandler(Add);
    IAsyncResult result
    = handler.BeginInvoke(1,2,null,null);
    Console.WriteLine(
    "Do other work... ... ...");
    Console.WriteLine(handler.EndInvoke(result));
    Console.ReadLine();
    }
    static int Add(int a, int b) {
    Console.WriteLine(
    "Computing "+a+" + "+b+" ...");
    Thread.Sleep(
    3000);
    Console.WriteLine(
    "Computing Complete.");
    return a+b;
    }
    }

    运行结果:
    **********AsyncInvokeTest**************
    Do other work... ... ...
    Computing
    1 + 2 ...
    Computing Complete.
    3

    可以看到,主线程并没有等待,而是直接向下运行了。
      但是问题依然存在,当主线程运行到EndInvoke时,如果这时调用没有结束(这种情况很可能出现),这时为了等待调用结果,线程依旧会被阻塞。
      解决的办法是用回调函数,当调用结束时会自动调用回调函数

    回调异步:

    public class Foo {
    static void Main() {
    Console.WriteLine(
    "**********AsyncInvokeTest**************");
    AddHandler handler
    = new AddHandler(Add);
    IAsyncResult result
    = handler.BeginInvoke(1,2,new AsyncCallback(AddComplete),
        
    "AsycState:OK");
    Console.WriteLine(
    "Do other work ... ... ...");
    Console.ReadLine();
    }

    static int Add(int a, int b) {
    Console.WriteLine(
    "Computing "+a+" + "+b+" ...");
    Thread.Sleep(
    3000);
    Console.WriteLine(
    "Computing Complete.");
    return a+b;
    }

    static void AddComplete(IAsyncResult result) {
    AddHandler handler
    = (AddHandler)((AsyncResult)result).AsyncDelegate;
    Console.WriteLine(handler.EndInvoke(result));
    Console.WriteLine(result.AsyncState);
    }
    }
  • 相关阅读:
    一行代码更改博客园皮肤
    fatal: refusing to merge unrelated histories
    使用 netcat 传输大文件
    linux 命令后台运行
    .net core 使用 Nlog 配置文件
    .net core 使用 Nlog 集成 exceptionless 配置文件
    Mysql不同字符串格式的连表查询
    Mongodb between 时间范围
    VS Code 使用 Debugger for Chrome 调试vue
    css权重说明
  • 原文地址:https://www.cnblogs.com/waw/p/2157088.html
Copyright © 2011-2022 走看看