• 异步


    同步方法和异步方法的区别

    同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果

    异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务的同时执行其它操作

    异步编程概览

    .NET Framework 允许您异步调用任何方法。定义与您需要调用的方法具有相同签名的委托;公共语言运行库将自动为该委托定义具有适当签名

    BeginInvoke 和 EndInvoke 方法。

    BeginInvoke 方法用于启动异步调用。它与您需要异步执行的方法具有相同的参数,只不过还有两个额外的参数(将在稍后描述)。

    BeginInvoke 立即返回,不等待异步调用完成。

    BeginInvoke 返回 IasyncResult,可用于监视调用进度。

    EndInvoke 方法用于检索异步调用结果。调用 BeginInvoke 后可随时调用 EndInvoke 方法;如果异步调用未完成,EndInvoke 将一直阻塞到

    异步调用完成。EndInvoke 的参数包括您需要异步执行的方法的 out 和 ref 参数(在 Visual Basic 中为 <Out> ByRef 和 ByRef)以及由

    BeginInvoke 返回的 IAsyncResult。

    四种使用 BeginInvoke 和 EndInvoke 进行异步调用的常用方法。调用了 BeginInvoke 后,可以:

    1.进行某些操作,然后调用 EndInvoke 一直阻塞到调用完成。

    2.使用 IAsyncResult.AsyncWaitHandle 获取 WaitHandle,使用它的 WaitOne 方法将执行一直阻塞到发出 WaitHandle 信号,然后调用

    EndInvoke。这里主要是主程序等待异步方法,等待异步方法的结果。

    3.轮询由 BeginInvoke 返回的 IAsyncResult,IAsyncResult.IsCompeted确定异步调用何时完成,然后调用 EndInvoke。此处理个人认为与

    相同。

    4.将用于回调方法的委托传递给 BeginInvoke。该方法在异步调用完成后在 ThreadPool 线程上执行,它可以调用 EndInvoke。这是在强制装

    换回调函数里面IAsyncResult.AsyncState(BeginInvoke方法的最后一个参数)成委托,然后用委托执行EndInvoke。

    警告   始终在异步调用完成后调用 EndInvoke。

    一般用委托,来实现异步

    private delegate void DoSomethingDelegate(string name);

    DoSomethingDelegate method = new DoSomethingDelegate(this.DoSomethingLong);

    private void DoSomethingLong(string name){}

    IAsyncResult asyncResult = null;

    method.Invoke("canshu");//同步

    asyncResult =method.BeginInvoke("canshu",null,null)//异步

    后两个参数。第一个是委托,也是回调函数 callback

    第二个null 回调参数 t.AsyncState=此参数

    AsyncCallback callback = new AsyncCallback(t=>Console.WriteLine(""));

    //asyncResult.AsyncWaitHandle.WaitOne();//一直等待

    //asyncResult.AsyncWaitHandle.WaitOne(-1);//一直等待

    //asyncResult.AsyncWaitHandle.WaitOne(1000);//等待1000毫秒,超时就不等待了

  • 相关阅读:
    32-3题:LeetCode103. Binary Tree Zigzag Level Order Traversal锯齿形层次遍历/之字形打印二叉树
    32-1题:不分行从上到下打印二叉树/BFS/deque/queue
    第31题:LeetCode946. Validate Stack Sequences验证栈的序列
    第30题:LeetCode155. Min Stack最小栈
    第29题:LeetCode54:Spiral Matrix螺旋矩阵
    第28题:leetcode101:Symmetric Tree对称的二叉树
    第27题:Leetcode226: Invert Binary Tree反转二叉树
    第26题:LeetCode572:Subtree of Another Tree另一个树的子树
    第25题:合并两个排序的链表
    第24题:反转链表
  • 原文地址:https://www.cnblogs.com/anyihen/p/12773281.html
Copyright © 2020-2023  润新知