簡體   English   中英

ManualResetEvent.set沒有在C#中觸發

[英]ManualResetEvent.set not getting fired in C#

我正在使用Visual Web Express2010。我正在嘗試將文件上傳到服務器並阻止調用函數,並在上傳完成后釋放它。 但是,主線程永遠不會不受阻礙。

public partial class MainPage : UserControl
{
    private FileStream fileStream;
    private static String responseStr = "";
    private static ManualResetEvent evt = new ManualResetEvent(false);
    public MainPage()
    {
        InitializeComponent();
        HtmlPage.RegisterScriptableObject("App", this);
    }

    public void sendPhoto()
    {
        uploadFile();
    }



    private void uploadFile()
    {
        uploadDataToServer(url);
        evt.WaitOne();
        postProcess();

    }

    public static void postProcess()
    {
        HtmlPage.Window.Invoke("postProcess2", responseStr);


    }

    void uploadDataToServer(String url)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.ContentType = "multipart/form-data; boundary=---------------------------" + _boundaryNo;
        request.Method = "POST";
        request.BeginGetRequestStream(writeCallback, request);
    }

    private void writeCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
        MemoryStream memoryStream = new MemoryStream();
        fileStream.CopyTo(memoryStream);
        if (memoryStream != null)
        {
            memoryStream.Position = 0;
            byte[] img = memoryStream.ToArray();
            Stream postStream = request.EndGetRequestStream(asynchronousResult);
            postStream.Write(img, 0, img.Length);
            request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);

        }
    }

    private void GetResponseCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
        Stream streamResponse = response.GetResponseStream();
        StreamReader streamRead = new StreamReader(streamResponse);
        string responseString = streamRead.ReadToEnd();
        streamRead.Close();
        streamResponse.Close();
        response.Close();
        responseStr = responseString;
        evt.Set();

    }


}

現在,當我在uploadFile中使用evt.WaitOne()時,整個應用程序都將處於等待狀態,並且沒有請求發送到服務器,即代碼永遠不會到達getResponseCallBack ,因此應用程序永遠不會喚醒。 但是,如果我不使用evt.WaitOne() ,則請求成功,但是由於在writeCallBack()函數中設置了響應文本並且請求是異步的,因此我無法讀取響應文本。 我應該怎么做才能克服這個問題?

I can't figure out:
1. If the request is multi-threaded / Async, then why evt.WaitOne() makes the complete app waiting and the request doesn't complete?
2. If the request is single threaded, then why postProcess() [removing the evt.WaitOne()] on trying to access responseStr [set in the getResponseCallBack()] doesn't get the proper response set in it.

[對不起,我對此並不陌生,感到困惑]。

謝謝。

抱歉,我忘了提到一件事,我正在使用silverlight

啟動異步操作然后等待其完成沒有任何意義。 而不是異步request.BeginGetRequestStream(writeCallback, request); 使用同步request.GetRequestStream(...)並使用它的結果。 則不需要ManualResetEvent。

這是我發現的問題的解決方案:

有些人建議使用HttpWebRequest.GetRequestStream並使調用同步。 但是,似乎Silverlight不允許這種情況發生。 此外,還有許多與線程和並行處理相關的混亂。

主要問題是我無法從回調函數訪問UI thread ,所以我使用了dispatcher方法,並且由於它始終確保在UI線程中執行操作,因此我的目標得以實現。 下面的技巧。

System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => { postProcess(); });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM