Я не могу остановить поток пользовательского интерфейса, когда я использую HttpWebRequest и HttpWebResponse, и он будет зависать при вызове WaitOne () - PullRequest
0 голосов
/ 24 июня 2011
    void method1() 
    {
        url = "http://192.168.5.22/mobile/testpost.php" ;     
        request = (HttpWebRequest)WebRequest.Create(Url);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.AllowAutoRedirect = true;
        //// request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6";

        RequestState myRequestState = new RequestState();
        myRequestState.Request = request;

        IAsyncResult result = request.BeginGetResponse(new AsyncCallback(FinaliseAsyncRequest), myRequestState);

        event_2.WaitOne();
        String s = myRequestState.responseAsString;
        String g = s;
    }

    private void FinaliseAsyncRequest(IAsyncResult AsyncResult)
    { 
        RequestState myrequestobj = (RequestState)AsyncResult.AsyncState;
        HttpWebRequest myrequest = myrequestobj.Request;
        response = (HttpWebResponse)myrequest.EndGetResponse(AsyncResult);
        string test1;
        test1 = ((HttpWebResponse)response).StatusDescription;
        if (response.StatusCode == HttpStatusCode.OK)
        {
            // Create the stream, encoder and reader.
            Stream responseStream = response.GetResponseStream();
            var x =response.GetResponseStream();
            //Encoding streamEncoder = Encoding.UTF8;
            StreamReader responseReader = new StreamReader(responseStream);
            responseAsString = responseReader.ReadToEnd();
            myrequestobj.responseAsString = responseAsString;
        }
        else
        {
            throw new Exception(String.Format("Response Not Valid {0}", response.StatusCode));
        }
        event_2.Set();
    }

1 Ответ

1 голос
/ 11 июля 2011

Методы HttpWebRequest, похоже, делегируют часть своей работы потоку пользовательского интерфейса.Вот часть трассировки стека из ситуации взаимоблокировки:

...
System.Windows.dll!System.Net.Browser.AsyncHelper.BeginOnUI(System.Net.Browser.BeginMethod beginMethod, System.AsyncCallback callback, object state) + 0x9b bytes
System.Windows.dll!System.Net.Browser.ClientHttpWebRequest.BeginGetResponse(System.AsyncCallback callback, object state) + 0x25 bytes
...

Обратите внимание на BeginOnUI после BeginGetResponse.«Асинхронный» обратный вызов фактически синхронизируется с потоком пользовательского интерфейса и поэтому зависает, когда поток пользовательского интерфейса заблокирован.Методы HttpWebResponse могут выполнять такую ​​же синхронизацию.

...