【问题标题】:How to handle multiple request batch processing using Task in ASP.NET?如何在 ASP.NET 中使用 Task 处理多个请求批处理?
【发布时间】:2014-10-06 23:01:22
【问题描述】:

我有一个选定的 contentIds 列表,对于每个内容 ID,我需要调用一个 api,获取响应,然后将收到的每个内容的响应保存在 DB 中。

用户一次可以选择 1-1000 范围内的任意数量的内容,并且可以在从 api 获得响应后传递此内容以更新内容数据库详细信息。

在这种情况下,我最终会为每个内容创建多个请求。

我想继续进行asp.net async Task 操作,然后写了下面这个方法。

我写的代码目前为每个 contentId 创建了一个任务,最后我正在等待所有任务得到响应。

Task.WaitAll(allTask​​s);

public static Task<KeyValuePair<int, string>> GetXXXApiResponse(string url, int contentId)
{
    var client = new HttpClient();

    return client.GetAsync(url).ContinueWith(task =>
    {
        var response = task.Result;
        var strTask = response.Content.ReadAsStringAsync();
        strTask.Wait();
        var strResponse = strTask.Result;

        return new KeyValuePair<int, string>(contentId, strResponse);
    });
}

我现在正在考虑为我创建的每个任务创建一个线程,然后由于工作线程的数量有限,这种方法最终会占用所有线程,这是我不希望发生的。

谁能帮助/指导我如何有效地处理这种情况,即处理多个 api 请求或使用异步任务等的批处理类型?

仅供参考:我正在使用 .NET 框架 4.5

【问题讨论】:

  • 您使用哪个版本的 C# 和 .Net?
  • 你没有使用await有什么原因吗?

标签: c# asp.net multithreading task-parallel-library async-await


【解决方案1】:

任务只是表示可以等待和取消的异步操作。创建新任务不一定会创建新线程(大多数情况下不会)。如果你正确使用async-await,在大部分异步操作中你甚至没有线程。

但是,同时发出许多请求仍然存在问题(例如,内容服务器负担过重)。所以你可能仍想使用SemaphoreSlimTPL Dataflow 来限制并发调用的数量:

private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(100);

public static async Task<KeyValuePair<int, string>> GetXXXApiResponse(string url, int contentId)
{
    await _semaphore.WaitAsync();
    try
    {
        var client = new HttpClient();
        var response = await client.GetAsync(url);
        var strResponse = await response.Content.ReadAsStringAsync();
        return new KeyValuePair<int, string>(contentId, strResponse);
    }
    finally
    {
        _semaphore.Release();
    }
}

要等待这些任务完成,您应该使用 Task.WhenAll 异步等待,而不是使用阻塞调用线程的 Task.WaitAll

await Task.WhenAll(apiResponses);

【讨论】:

    猜你喜欢
    • 2020-12-07
    • 1970-01-01
    • 2014-07-06
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2023-02-09
    • 1970-01-01
    相关资源
    最近更新 更多