如何修改不在同一线程中的对象

本文关键字:一线 线程 对象 何修改 修改 | 更新日期: 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);
}