RestSharp.RestClient.ExecuteTaskAsync永远等待

时间:2018-07-26 17:47:38

标签: c# restsharp

我试图从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);
    }

1 个答案:

答案 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,代码将成功运行。