首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 執行緒系列講座(一):BeginInvoke/EndInvoke 非同步模式 (四) 回呼與 HttpWebRequest 範例

     編輯:關於C語言

前言

本系列第一講第四節,介紹非同步回呼模式避免阻塞 UI,並展示 HttpWebRequest.BeginGetResponse/EndGetResponse 實際應用。

非同步回呼模式 (WinForms 範例)


private delegate int MyMethod();
private int LongRunning() { Thread.Sleep(10000); return 100; }

private void Callback(IAsyncResult ar)
{
    if (ar == null) return;
    var result = ((MyMethod)ar.AsyncState).EndInvoke(ar);
    // 跨執行緒更新 UI 需 Invoke (此處簡化)
    textBox1.Text = result.ToString();
}

private void btnStart_Click(object sender, EventArgs e)
{
    var del = new MyMethod(LongRunning);
    del.BeginInvoke(Callback, del); // 立即返回,UI 不阻塞
}

關鍵點

  • BeginInvoke 最後兩參數:AsyncCallback 與 object state (通常傳委派自身)。
  • 回呼方法執行於**執行緒池執行緒**,**不可直接操作 UI 控制項**,需 Control.Invoke 或 SynchronizationContext。
  • AsyncState 取回傳入的 state 物件。
  • 必須呼叫 EndInvoke 取得結果或傳播例外,**否則資源洩漏**。

HttpWebRequest 非同步下載範例


private void DownloadCallback(IAsyncResult ar)
{
    if (ar == null) return;
    var req = (HttpWebRequest)ar.AsyncState;
    try
    {
        using (var resp = (HttpWebResponse)req.EndGetResponse(ar))
        using (var stream = resp.GetResponseStream())
        using (var reader = new StreamReader(stream))
        {
            string html = reader.ReadToEnd();
            // UI 更新需 Invoke
            this.Invoke((Action)(() => textBox1.Text = html));
        }
    }
    catch (Exception ex)
    {
        this.Invoke((Action)(() => textBox1.Text = "Error: " + ex.Message));
    }
}

private void btnDownload_Click(object sender, EventArgs e)
{
    var req = (HttpWebRequest)WebRequest.Create("https://www.example.com");
    req.BeginGetResponse(DownloadCallback, req);
}

APM (Asynchronous Programming Model) 總結

模式Begin 方法End 方法適用場景
委派BeginInvokeEndInvoke任意同步方法非同步化
WebRequestBeginGetResponseEndGetResponseHTTP 下載
StreamBeginRead/WriteEndRead/Write檔案/網路流
SocketBeginSend/ReceiveEndSend/Receive低層網路通訊

結語

APM 回呼模式是 .NET 1.0 時代非同步基石。現代開發請優先使用 async/await (TAP),但理解 APM 有助於維護舊代碼與掌握底層機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved