如何修改不在同一线程中的对象
本文关键字:一线 线程 对象 何修改 修改 | 更新日期: 2023-09-27 18:12:50
我正在做一个异步web请求。并且需要根据响应来做消息返回。
正在考虑做某事,就像下面
// 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;
最好的方法是什么?
您是对的,该变量将始终为空,因为您使用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);
}