Как получить параметр, переданный асинхронному методу WebService в обработчике события Completed - PullRequest
0 голосов
/ 12 февраля 2010

Как следует из названия:

Мой вызов метода веб-службы выглядит как

proxy.BeginGetWhatever(int param)
{
}

Предположим, что обработчик, зарегистрированный для этого вызова,

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

Как мне получить доступ к параметру param в обработчике? (e.Result вернет все, что должен получить вызов веб-службы. Я также заинтересован в том, чтобы параметр стал доступен)

Ответы [ 2 ]

1 голос
/ 12 февраля 2010

Каждый асинхронный метод, созданный для прокси 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, поэтому, если метод принимает несколько параметров, вы можете поместить их все в собственный класс и передать класс в качестве состояния.

0 голосов
/ 12 февраля 2010

Ваш веб-метод должен был бы как-то вернуть его. Допустим, ваш веб-метод должен вернуть исходный параметр и некоторые другие данные обратно вызывающей стороне, вот подпись веб-метода:

CustomReturnClass GetWhatever(int param);

И определение 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...