这是实现异步编程模型的好方法吗?

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,或者有什么问题,我没想到.

Rob*_*sor 1

我认为这是实现 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。