C#之回调函数(CallbackIAsyncResult)
刚接触这个名词的时候不是很懂,查询了MSDN,上⾯解释的是引⽤在相应异步操作完成时调⽤的⽅法。当时我就有点懵,怎么异步,怎么引⽤?
然后再查资料,这个是⽤到IAsyncResult的,在编辑器⾥⾯输⼊IAsyncResult,查看元数据是如下结果
// 摘要:
//    表⽰异步操作的状态。
[ComVisible(true)]
public interface IAsyncResult
{
// 摘要:writeline函数
//    获取⽤户定义的对象,它限定或包含关于异步操作的信息。
//
// 返回结果:
//    ⽤户定义的对象,它限定或包含关于异步操作的信息。
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次⾁眼能分辨出来吗_

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。