刚接触这个名词的时候不是很懂,查询了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次肉眼能分辨出来吗???_