我试图从RestSharp文档,示例和堆栈溢出帖子中寻找解决方案,但没有找到适合我的情况的
。我在这里要做的是同时发送多个异步请求,并在继续处理之前等待所有它们的响应返回-同时使用数据。但是,该程序挂在Task.WaitAll上。
public List<CatalogModel> GetCatalogListAsync(string url, List<string> handles)
{
tasks = new List<Task<IRestResponse<CatalogModel>>>();
foreach (var handle in handles)
{
var task = GetCatalogTaskAsync(url, handle);
tasks.Add(task);
}
var tasksArray = tasks.ToArray();
Task.WaitAll(tasksArray);
var catalogList = new List<CatalogModel>();
foreach (var task in tasksArray)
{
var result = task.Result;
var catalog = new CatalogModel();
if (result.StatusCode == HttpStatusCode.OK)
{
catalog = result.Data;
}
else
{
_logging.LogErrorMessage(result.ErrorMessage);
}
catalogList.Add(catalog);
}
return null;
}
这是负责返回任务的方法。
public async Task<IRestResponse<CatalogModel>> GetCatalogTaskAsync(string url, string handle)
{
var client = new RestSharp.RestClient(url);
var request = new RestRequest(){Resource = $"catalog/{handle}.json"};
return await client.ExecuteGetTaskAsync<CatalogModel>(request);
}
答案 0 :(得分:0)
一个任务正在返回并且永远不会被激活。所以Task.WaitAll只是在等待某些事情发生。
要解决此问题,必须在调用Client.ExecuteAsync时添加一个回调方法。
public Task<IRestResponse> GetCatalogAsync(string url, string handle)
{
var client = new RestSharp.RestClient(url);
var request = new RestRequest(){Resource = $"catalog/{handle}.json"};
var tcs = new TaskCompletionSource<IRestResponse>();
client.ExecuteAsync(request, response =>
{
tcs.SetResult(response);
});
return tcs.Task;
}
然后通过在调用方法中使用Task.WaitAll,代码将成功运行。