首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 異步 WebRequest 回調中獲取響應數據:使用委托/回調模式傳遞 JsonSource

     編輯:程式設計綜合問答

問題:BeginGetResponse 異步回調 ResponseCallback 方法內獲取到 JsonSource,但外部調用類 B 無法直接獲取該值。

核心模式:異步回調傳遞結果

定義委托或回調接口,在異步完成時調用,將結果傳遞給調用方。

方案一:Action 委托回調 (簡潔)

public class A {
    public void SetJsonSource(string uri, Action onCompleted) {
        WebRequest req = WebRequest.Create(uri);
        req.Method = "GET";
        req.BeginGetResponse(ar => {
            try {
                var response = req.EndGetResponse(ar);
                using (var stream = response.GetResponseStream())
                using (var reader = new StreamReader(stream)) {
                    string json = reader.ReadToEnd();
                    onCompleted?.Invoke(json); // 回調傳遞結果
                }
            } catch (Exception ex) {
                onCompleted?.Invoke(null); // 或傳遞異常
            }
        }, req);
    }
}

// 調用
public class B {
    public void GetSource() {
        var a = new A();
        a.SetJsonSource("https://api.example.com", json => {
            if (json != null) {
                Console.WriteLine("收到 JSON: " + json);
                // 後續處理...
            }
        });
    }
}

方案二:Task 包裝 (現代 async/await 推薦)

public class A {
    public async Task GetJsonSourceAsync(string uri) {
        using (var client = new HttpClient()) { // 推薦 HttpClient
            return await client.GetStringAsync(uri);
        }
    }
}

public class B {
    public async void GetSource() {
        var a = new A();
        string json = await a.GetJsonSourceAsync("https://api.example.com");
        Console.WriteLine(json);
    }
}

關鍵點

  • 異步操作**不能**直接返回值給同步調用棧。
  • 必須通過**回調委托**、**事件**、**Task**、**IAsyncResult.AsyncState** 等模式將結果「推」給後續邏輯。
  • 優先使用 HttpClient + async/await,代碼線性、異常處理自然、避免回調地獄。

採用委托回調或 Task 包裝,即可在異步完成時獲取 JsonSource 並繼續業務流程。

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