2011-09-21 73 views
1

我有C#代码,并且webRequest.begingetresponse有问题。WebRequest.BeginGetResponse不能异步工作

当我尝试将它用于异步调用时,工作线程被阻塞并等待回调被调用。但是,正如我在文档中读到的,当前线程应该继续运行,并且一旦响应从服务器返回,应由另一个线程调用回调方法。

[UPDATE]实际上从服务器获取响应是当前线程被阻塞的地方,当我检查线程ID时,调用回调的线程是发送请求的线程。

任何想法可能会失踪?

这里的代码片段:

public class MyRequestState 
{ 

    public WebRequest Request; 
    public WebResponse Response; 
    public ManualResetEvent allDone = new ManualResetEvent(false); 

    public MyRequestState() 
    { 

     Request = null; 
     Response = null; 
    } 
} 


public class SendRequest 
{ 
    private void ResponseCallback(IAsyncResult result) 
    { 
    //do sth ... 
    state.Response = (HttpWebResponse)request.EndGetResponse(result); 
    //do sth ... 
    state.allDone.Set(); 
    } 
    public void MakeWebRequestAsync(string url) 
    { 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    request.Method = "GET"; 
    request.Proxy = null; 
    state state = new MyRequestState(); 
    state.Request = request; 

    IAsyncResult result = request.BeginGetResponse(new System.AsyncCallback(ResponseCallback), state); 

    state.allDone.WaitOne(); 
    } 

}

+4

请显示密码。 – Michael

+0

这是Silverlight吗?我在silverlight中遇到了这个确切的问题,因为虽然调用是异步的,但是开始和结束getResponse都是在同一个线程上完成的,这就是为什么你无限期地被阻塞。它乞求的问题,为什么你想使异步调用同步? – Matt

+0

你能给更多的背景吗?这个代码运行在什么样的应用程序中?它是控制台应用程序,silverlight,服务过程等?另外,该框架的哪个版本?什么是你打的网址? – feroze

回答

0

WebRequest.BeginGetResponse等待连接同步,然后异步接收数据。如果连接需要一些时间,它会暂时冻结调用线程。

+0

实际上,从服务器获取响应是当前线程被阻止的位置,并且当我检查线程ID时,调用回调的线程与发送请求的线程相同。 – iampat

+0

你可以发布一些更多的信息(或链接到来源)在哪里可以了解更多关于此?如果BeginGetResponse应该等待连接,它的目的是什么?如何能够异步处理等待连接? – Suma

0

您在启动请求后正在等待您的ManualResetEvent权限。这就是为什么你的线程阻塞。线程没有被标记为继续直到完成回调被调用。

+0

当我跟踪代码时,调用堆栈显示我在beginGetResponse处被阻塞,并且它甚至没有命中state.allDone.WaitOne();过了一段时间,它会触发回调,然后返回state.allDone.WaitOne()。我也检查了结果的CompletedSynchronously属性,它总是如此。线程ID呢?同一个线程调用请求和回调。 – iampat