BFr*_*ree 5 .net c# multithreading asynchronous
我最近一直在努力学习关于.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)
{
}
Run Code Online (Sandbox Code Playgroud)
现在,假设我正在编写一些库,并且我希望将此功能公开给任何使用我的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);
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,每个代表都将BeginXxx和EndXxx功能融入其中.是不是可以利用它,只是暴露IAsyncResult,或者有什么问题,我没想到.
我认为这是实现 APM 的一种好方法,但目前您会收到每个实例多个异步调用的错误。
为什么不直接外部化委托的用法呢?
我的意思是,如果您只是将实际逻辑放入类中,然后让调用您方法的任何人执行以下操作:
MyClass c = new MyClass();
Func<int, int> f = c.DoSomeWork;
IAsyncResult ar1 = f.BeginInvoke(1, null, null);
IAsyncResult ar2 = f.BeginInvoke(2, null, null);
//...
Run Code Online (Sandbox Code Playgroud)
我想我所提倡的甚至不是自己实现 APM,而只是建议调用您的方法的人使用内置于委托中的 APM。