C# 如何在异步方法中调用EndInvoke

C# 如何在异步方法中调用EndInvoke,c#,multithreading,.net-4.0,asynchronous,C#,Multithreading,.net 4.0,Asynchronous,我有一个正常的方法 public List<string> FindNearByCity(string targetCity) { // ... some implementation } 公共列表FindNearByCity(字符串targetCity) { //…一些实施 } 我想为这个方法添加异步支持,所以我写了以下内容: public IAsyncResult BeginFindNearByCity(string targetCity, AsyncCallback cal

我有一个正常的方法

public List<string> FindNearByCity(string targetCity)
{
// ... some implementation
}
公共列表FindNearByCity(字符串targetCity)
{
//…一些实施
}
我想为这个方法添加异步支持,所以我写了以下内容:

public IAsyncResult BeginFindNearByCity(string targetCity, AsyncCallback callback, object obj)
{
    Func<string, List<string>> method = FindNearByCity;
    return method.BeginInvoke(targetCity, callback, obj);
}

public List<string> EndFindNearByCity(IAsyncResult  result)
{
    Func<string, List<string>> method = FindNearByCity;
    return method.EndInvoke(result);
}
public IAsyncResult BeginFindNearByCity(字符串targetCity,异步回调,对象obj)
{
Func方法=FindNearByCity;
返回方法.BeginInvoke(targetCity,callback,obj);
}
公共列表EndFindNearByCity(IAsyncResult结果)
{
Func方法=FindNearByCity;
返回方法.EndInvoke(结果);
}
BeginFindNearByCity可以正常工作,但是当它涉及EndFindNearByCity时,当遇到EndInvoke时将抛出异常

我研究了auto-gen异步web服务方法,似乎需要实现一个称为“ChannelBase”的东西

有谁能给我指一些更简单的东西,比如教程或示例,让我看看


谢谢

您在
EndXXX
方法中创建的委托与您在
BeginXXX
方法中创建的委托是一个单独的实例,因此它不知道您正在传递给它的
EndInvoke()
方法的
IAsyncResult

您必须在
EndXXX
方法中使用与
BeginXXX
方法相同的委托,例如:

public class Foo
{
    private readonly Func<string, List<string>> method;

    public Foo()
    {
        this.method = this.FindNearByCity;
    }

    public IAsyncResult BeginFindNearByCity(string targetCity, AsyncCallback callback, object obj)
    {
        return this.method.BeginInvoke(targetCity, callback, obj);
    }

    public List<string> EndFindNearByCity(IAsyncResult  result)
    {
        return this.method.EndInvoke(result);
    }

    public List<string> FindNearByCity(string targetCity)
    {
        // ... some implementation
    }
}
公共类Foo
{
私有只读Func方法;
公共食物(
{
this.method=this.FindNearByCity;
}
公共IAsyncResult BeginFindNearByCity(字符串targetCity、异步回调、对象obj)
{
返回此.method.BeginInvoke(targetCity,callback,obj);
}
公共列表EndFindNearByCity(IAsyncResult结果)
{
返回此.method.EndInvoke(结果);
}
公共列表FindNearByCity(字符串targetCity)
{
//…一些实施
}
}

您在
EndXXX
方法中创建的委托与您在
BeginXXX
方法中创建的委托是一个单独的实例,因此它不知道您正在传递给其
EndInvoke()
方法的
IAsyncResult

您必须在
EndXXX
方法中使用与
BeginXXX
方法相同的委托,例如:

public class Foo
{
    private readonly Func<string, List<string>> method;

    public Foo()
    {
        this.method = this.FindNearByCity;
    }

    public IAsyncResult BeginFindNearByCity(string targetCity, AsyncCallback callback, object obj)
    {
        return this.method.BeginInvoke(targetCity, callback, obj);
    }

    public List<string> EndFindNearByCity(IAsyncResult  result)
    {
        return this.method.EndInvoke(result);
    }

    public List<string> FindNearByCity(string targetCity)
    {
        // ... some implementation
    }
}
公共类Foo
{
私有只读Func方法;
公共食物(
{
this.method=this.FindNearByCity;
}
公共IAsyncResult BeginFindNearByCity(字符串targetCity、异步回调、对象obj)
{
返回此.method.BeginInvoke(targetCity,callback,obj);
}
公共列表EndFindNearByCity(IAsyncResult结果)
{
返回此.method.EndInvoke(结果);
}
公共列表FindNearByCity(字符串targetCity)
{
//…一些实施
}
}