最近我一直在努力学习 .Net 多线程技术。(进步了不少,但仍然感觉有很多需要学习的地方)。目前我正在专注于 APM (异步编程模型),也被称为:
//non async method
public int DoSomeWork(int arg)
{
//do something and return result
}
//async version
public IAsyncResult BeginDoSomeWork(int arg, AsyncCallback callback, object @object)
{
}
public int EndDoSomeWork(IAsyncResult result)
{
}
现在,假设我正在编写一些库,并且希望将此功能公开给使用我的API的任何人,我正在考虑实现此模式的方法。实现IAsyncResult接口是一种可能性,但它似乎相当复杂。我的问题是,如果使用委托是可接受的解决方案。我的意思是:
public class MyClass
{
private Func<int, int> func;
//non async method
public int DoSomeWork(int arg)
{
//do something and return result
}
//async version
public IAsyncResult BeginDoSomeWork(int arg, AsyncCallback callback, object @object)
{
this.func = new Func<int, int>(DoSomeWork);
var asyncResult = this.func.BeginInvoke(arg,callback,object);
return asyncResult;
}
public int EndDoSomeWork(IAsyncResult result)
{
return this.func.EndInvoke(result);
}
}
基本上,每个委托都已经内置了BeginXxx和EndXxx功能。利用这一点并暴露IAsyncResult是否可以?或者我没有考虑到的问题?