Вы правы, эта переменная всегда будет пустой, потому что вы запустили асинхронный запрос с помощью метода 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);
}