C# 之回调函数(Callback/IAsyncResult)

刚接触这个名词的时候不是很懂,查询了MSDN,上面解释的是引用在相应异步操作完成时调用的方法。当时我就有点懵,怎么异步,怎么引用?
然后再查资料,这个是用到IAsyncResult的,在编辑器里面输入IAsyncResult,查看元数据是如下结果

// 摘要:
    //     表示异步操作的状态。
    [ComVisible(true)]
    public interface IAsyncResult
    {
        // 摘要:
        //     获取用户定义的对象,它限定或包含关于异步操作的信息。
        //
        // 返回结果:
        //     用户定义的对象,它限定或包含关于异步操作的信息。
        object AsyncState { get; }
        //
        // 摘要:
        //     获取用于等待异步操作完成的 System.Threading.WaitHandle。
        //
        // 返回结果:
        //     用于等待异步操作完成的 System.Threading.WaitHandle。
        WaitHandle AsyncWaitHandle { get; }
        //
        // 摘要:
        //     获取一个值,该值指示异步操作是否同步完成。
        //
        // 返回结果:
        //     如果异步操作同步完成,则为 true;否则为 false。
        bool CompletedSynchronously { get; }
        //
        // 摘要:
        //     获取一个值,该值指示异步操作是否已完成。
        //
        // 返回结果:
        //     如果操作完成则为 true,否则为 false。
        bool IsCompleted { get; }
    }

有了这些还是不会用啊,继续查资料
后面查到了,这个是一个委托?-_-||,好吧,是一个委托就好说,那么就新建一个委托

using System;
using System.Threading;
namespace Async
{
    class Program
    {
        public delegate int dele_async(int a);
        static void Main(string[] args)
        {
        	dele_async dele_method=new dele_async(Executefunc);
        }
         private static int Executefunc(int m)
        {
            Console.WriteLine("执行invoke函数完毕");
            Thread.Sleep(1000);
            return m * m;
        }
   }
}

新建了一个委托。
顺便写实例化方法,平时执行的时候如下执行

int result=dele_method(10);

毫无疑问,结果是100.

这个也跟回调不一致啊,别急,往下看
委托方法实例化后,有Invoke和BeginInvoke方法,Invoke是同步调用,可以如下

int result=dele_method.Invoke(10);

结果是一样的,这个跟上面是一个结果,同步等待,BeginInvoke就不一样了,这个是异步等待

dele_method.BeginInvoke(7, asynccallback, dele_method);

其中asynccallback方法是回调方法,可以接收方法中的返回值

private static void asynccallback(IAsyncResult iar)
{
     dele_async dele_method= (dele_async)iar.AsyncState;
     int result= dele_method.EndInvoke(iar);
     Console.WriteLine(result);
     Console.WriteLine("执行callback函数完毕");
}

AsyncState:这个是IAsyncResult接口中的一个对象,会获取用户定义的对象,如上定义的对象是dele_async。
此时主线程不会等待线程执行结束,而是直接往下运行,回调函数会继续执行,其中EndInvoke方法会接收返回值
这种不会阻塞主线程,而是用回调函数去执行结果,这种就是回调函数。

这种主要应用于大量数据的读取,这种方式比较适合
ps:今天在csdn上看到一个例子,说在UI上一秒2000次的刷新,异步还是卡顿,我想的是一秒2000次肉眼能分辨出来吗???_

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值