zoukankan      html  css  js  c++  java
  • 使用BeginInvoke,EndInvoke异步调用委托

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Main ThreadId = " + Thread.CurrentThread.ManagedThreadId);
                //给委托赋值
                Func<long, long> delegateMethod = new Func<long, long>(CalcSum);
                //异步执行委托,这里把委托本身作为asyncState对象传进去,在回调函数中需要使用委托的EndInvoke来获得结果
                delegateMethod.BeginInvoke(200, DoneCallback, delegateMethod);
                //异步执行委托,抛出异常
                delegateMethod.BeginInvoke(10000000000, DoneCallback, delegateMethod);
                Console.ReadLine();
            }
    
            //委托回调函数
            static void DoneCallback(IAsyncResult asyncResult)
            {
                //到这儿委托已经在异步线程中执行完毕
                Console.WriteLine("DoneCallback ThreadId = " + Thread.CurrentThread.ManagedThreadId);
    
                Func<long, long> method = (Func<long, long>)asyncResult.AsyncState;
                //委托执行的异常会在EndInvoke时抛出来
                try {
                    //使用BeginInvoke时传入委托的EndInvoke获得计算结果,这时候计算结果已经出来了,有异常的话也在这儿抛出来
                    long sum = method.EndInvoke(asyncResult);
                    Console.WriteLine("sum = {0}",sum);
                }
                catch (OverflowException)
                {
                    Console.WriteLine("运算溢出了");
                }
            }
    
            //委托方法
            static long CalcSum(long topLimit)
            {
                //委托在另一个线程中开始执行
                Console.WriteLine("Calc ThreadId = " + Thread.CurrentThread.ManagedThreadId);
                checked
                {
                    long result = 0;
                    for (long i = 0; i < topLimit; i++)
                    {
                        result += i;
                    }
                    return result;
                }
            }
        }
    
    }
    

      

  • 相关阅读:
    影响一个UIView是否能正常显示的几个因素
    浅谈多进程多线程的选择
    Spring阅读方法
    数据库范式通俗解释
    MySQL学习笔记(二):MySQL数据类型汇总及选择参考
    MySQL学习笔记(一):SQL基础
    存储过程优缺点
    MySQL学习笔记(三):常用函数
    bzoj 3576[Hnoi2014]江南乐 sg函数+分块预处理
    bzoj 3166 [Heoi2013]Alo 可持久化Trie
  • 原文地址:https://www.cnblogs.com/yukaizhao/p/begininvoke_delegate.html
Copyright © 2011-2022 走看看