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;
                }
            }
        }
      
    }
  • 相关阅读:
    osharp3引入事务后操作结果类别的调整
    Code First 迁移
    表达式拼接Expression<Func<IEntityMapper, bool>> predicate
    ASP.NET中Session的sessionState 4种mode模式
    EF Code First Migrations数据库迁移
    啊里大鱼短信发送API
    asp.net服务器控件的生命周期
    osharp3使用经验:整合DbContextScope 文章 1
    关于MarshalByRefObject的解释
    数据库操作事务IsolationLevel 枚举
  • 原文地址:https://www.cnblogs.com/lidabo/p/2512821.html
Copyright © 2011-2022 走看看