2011-09-21 106 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