как изменить объект, который не находится в той же теме - PullRequest
0 голосов
/ 30 октября 2011

Я работаю над асинхронным веб-запросом. и нужно в зависимости от ответа сделать сообщение возврат.

думал сделать что-то вроде следующего

// creating request

string messageToReturn = string.empty;
request.BeginGetResponse(ar => 
            { 
                HttpWebRequest req2 = (HttpWebRequest)ar.AsyncState; 
                var response = (HttpWebResponse)req2.EndGetResponse(ar);

                // is it safe to do this?
                messageToReturn = "base on respone, assign different message"; 


            }, request);

// will i get any response message? i will always get empty right?
// since response is handle in another thread
return messageToReturn;

Каков наилучший способ сделать это?

1 Ответ

0 голосов
/ 30 октября 2011

Вы правы, эта переменная всегда будет пустой, потому что вы запустили асинхронный запрос с помощью метода BeginGetResponse. Так что на самом деле у вас есть несколько вариантов здесь. Вы можете либо заблокировать исполняющий поток, пока ответ не вернется (вероятно, это действительно плохая идея, если у вас нет очень веских аргументов для этого), либо использовать асинхронный шаблон, основанный на событиях, для оповещения вызывающих абонентов, когда ваш ответ возвращается ...

Рассмотрим часть вашего кода, завернутого в метод

public void GetMessageAsync()
{
    string messageToReturn = string.empty;
    request.BeginGetResponse(ar => 
            { 
                HttpWebRequest req2 = (HttpWebRequest)ar.AsyncState; 
                var response = (HttpWebResponse)req2.EndGetResponse(ar);

                // is it safe to do this?
                messageToReturn = "base on respone, assign different message"; 


            }, request);
}

Чтобы подключить шаблон, основанный на событиях, здесь. Мы определяем пользовательский класс EventArgs и пользовательское событие, которое могут прослушивать вызывающие абоненты и которое мы будем запускать при получении ответа.

public class StringEventArgs : EventArgs
{
   public string Message { get; set; }
}

public event EventHandler<StringEventArgs> MessageReturned;

public void GetMessageAsync()
{
    //string messageToReturn = string.empty;
    request.BeginGetResponse(ar => 
            { 
                HttpWebRequest req2 = (HttpWebRequest)ar.AsyncState; 
                var response = (HttpWebResponse)req2.EndGetResponse(ar);

                //messageToReturn = "base on respone, assign different message"; 
                this.MessageReturned(this, new StringEventArgs { Message = response.ToString() });

            }, request);
}
...