我得到的最接近的是
public async Task<IEnumerable<dynamic>> GetResults(string id, int n) {
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Token " + token);
Stream results = await client.GetStreamAsync(baseurl + id + "/results");
StreamReader sr = new StreamReader(results);
while(!sr.EndOfStream) {
string line = await sr.ReadLineAsync();
yield return Json.Decode(line);
}
}
但它说它不能是迭代器 block ,因为 System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<dynamic>>
不是迭代器接口(interface)类型。
但是,我找不到没有异步方法的方法来获取流(我只能找到 GetStreamAsync,没有 GetStream 的定义),这迫使我有一个异步方法,这迫使我返回一个任务。
最佳答案
设法使用 WebRequest 类并按照该页面上的示例进行操作:
public IEnumerable<dynamic> GetResults(string id, int n) {
WebRequest request = WebRequest.Create(baseurl + id + "/results");
request.Headers.Add("Authorization", "Token " + token);
WebResponse response = request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader sr = new StreamReader(responseStream);
while(!sr.EndOfStream) {
string line = sr.ReadLine();
yield return Json.Decode(line);
}
}
WebResponse 有一个 GetResponseStream
,而 HttpClient
只有一个 GetStreamAsync
。这使我不必等待,也不必使用异步方法。
关于c# - 如何在 C# 中创建一个将生成 HTTP 响应主体行的迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24828091/