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);
    }
    }
  • 相关阅读:
    【模板】Sparse-Table
    UVa 11235 Frequent values
    【模板】树状数组
    UVa 1428 Ping pong
    数学技巧
    UVa 11300 Spreading the Wealth
    UVa 11729 Commando War
    UVa 11292 Dragon of Loowater
    POJ 3627 Bookshelf
    POJ 1056 IMMEDIATE DECODABILITY
  • 原文地址:https://www.cnblogs.com/waw/p/2157088.html
Copyright © 2011-2022 走看看