C# 如何在已完成事件的处理程序中检索传递给WebService Async方法的参数

C# 如何在已完成事件的处理程序中检索传递给WebService Async方法的参数,c#,web-services,event-handling,C#,Web Services,Event Handling,正如标题所说: 我的web服务方法调用如下所示 proxy.BeginGetWhatever(int param) { } 让我们假设注册到此调用的处理程序是 private void GetWhateverCompleted(object sender, GetWhateverEventArgs e) { //HERE } 如何访问处理程序中的参数param?(e.Result将返回web服务调用应该获取的任何内容。我也对使param可用感兴趣)您的web方法必须以某种方式返回它。

正如标题所说:

我的web服务方法调用如下所示

proxy.BeginGetWhatever(int param)
{
}
让我们假设注册到此调用的处理程序是

private void GetWhateverCompleted(object sender, GetWhateverEventArgs e)
{
    //HERE
}

如何访问处理程序中的参数param?(e.Result将返回web服务调用应该获取的任何内容。我也对使param可用感兴趣)

您的web方法必须以某种方式返回它。假设您的webmethod将原始参数和一些其他数据返回给调用者,下面是web方法签名:

CustomReturnClass GetWhatever(int param);
以及web服务中定义的CustomReturnClass的定义

public class CustomReturnClass
{
   public int OrigParameter { get; set; }
   public object OtherStuff { get; set; }
}
然后在回调(传统样式)中,您将有:

private void GetWhateverCompleted(IAsynchResult res)
{
    CustomReturnClass retVal = (CustomReturnClass)res.EndGetWhatever(res);
    int origParam = retVal.OrigParameter;
}
但是,它看起来像是在使用WCF,所以更像这样:

private void GetWhateverCompleted(object sender, GetWhateverEventArgs e)
{
    CustomReturnClass retVal = e.Result;
    int origParam = retVal.OrigParameter;
}

为WCF代理生成的每个异步方法都将有一个重载,该重载采用
userState
参数。例如,如果您有一个
GetCustomerByID
方法,您将看到两个重载:

public void GetCustomerByIDAsync(Guid customerID) { ... }
public void GetCustomerByIDAsync(Guid customerID, object userState { ... }
您可以在
userState
中放入您想要的任何内容,它将在完成事件中发回。因此,如果您只想返回原始的
customerID
,在上述情况下:

public void BeginGetCustomerByID(Guid customerID)
{
    // Second instance of customerID is userState
    service.GetCustomerByIDAsync(customerID, customerID);
}

private void service_GetCustomerByIDCompleted(object sender,
    GetCustomerByIDCompletedEventArgs e)
{
    Guid customerID = (Guid)e.UserState;
    // Do something with e.Error or e.Result here
}

您可以在
userState
中放入您想要的任何内容,因此,如果该方法接受多个参数,您可以将它们全部放入一个自定义类中,并将该类作为状态传递。

我想,澄清一下,挑战是返回web服务方法返回的任何内容+参数,以便我可以在处理程序中使用它。我怎样才能做到这一点呢?好吧,我想这次我可能会有更好的理解。检查我的编辑,看看是否有帮助。