【问题标题】:How to call a single method "n" number of times asynchronously? [duplicate]如何异步调用单个方法“n”次? [复制]
【发布时间】:2019-04-26 22:11:38
【问题描述】:

目前我们有一个 C# 窗口服务应用程序,可以使用 REST API 及时从 JIRA 中提取数据。 在该应用程序中,我们有一个方法可以从 JIRA 中提取数据,方法是将项目名称作为输入传递给该方法,并且它将返回一个布尔标志以指示项目已成功提取。

到目前为止,我们通过在项目列表的for循环中调用该方法,以同步的方式从JIRA中提取了10个项目数据。

新需求需要从 JIRA 中提取“N”个项目?如果我们遵循同步方式,我们需要等待很长时间才能完成。但是通过以异步方式调用该方法,我们可以减少一些时间。

'N' 会随着时间的推移而增加。

我需要一个示例逻辑来应用相同的逻辑。

【问题讨论】:

  • 这有点宽泛,但您可以考虑将您的逻辑放入线程中。然后,主应用程序每次想要从新项目中获取数据时都会简单地生成一个新线程。
  • 我同意大卫的观点。你可以为 (int i=0;i 写这样的东西
  • @NoImagination 线程 != 异步
  • @johnny5,那有什么区别呢?
  • @NoImagination,异步操作不一定发生在另一个线程上,异步只会释放线程以在不依赖 CPU 的操作期间使用。例如,写入磁盘或发出 Web 请求,假设您正在使用适当的异步方法

标签: c# asynchronous


【解决方案1】:

您可以利用 C# 语言中的异步功能。这样您就不必产生任何线程,但可以同时执行对 JIRA api 的调用,而不是立即等待对 JIRA 的调用。示例:

public async Task FetchProjects(params string[] projects)
{
    var tasks = new List<Task<bool>>();
    foreach (var project in projects)
    {
        // Calling the api, but not awaiting the call just yet.
        tasks.Add(FetchProjectInfo(project));
    }

    // awaiting all api calls here.
    await Task.WhenAll(tasks);

    // You might want to check whether all calls returned true here.
}

// This would be your existing method.
private async Task<bool> FetchProjectInfo(string project)
{
    string url = CreateUrl(project);

    // TODO: Include error handling 
    // (and you should actually reuse the HttpClient between calls)
    using (var client = new HttpClient())
    using (var response = await client.GetAsync(url))
    {
        // TODO: Do something with response.
    }
}

【讨论】:

    猜你喜欢
    • 2016-07-20
    • 1970-01-01
    • 2016-12-28
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    相关资源
    最近更新 更多