异步调用webservice并等待所有线程完成

2023-12-08

我需要多次调用 Web 服务来获取数据,然后将这些数据放入数据库中,因此我得到了以下代码:

foreach (string v in options)
{
    IList<MySampleNode> nodes = _pi.GetData(v);
    _dbService.SaveToDb(nodes);
}

GetData 实现如下所示:

public IList<MySampleNode> GetData(string v)
{
    IList<MySampleNode> nodes = null;
    try
    {
        var client = new WsClient();
        IEnumerable<IWsObject> wsNodes = client.getNodes(new getClassLevel { code = v });
        nodes = ProcessData(wsNodes);
    }
    return nodes;
}

我想将此代码修改为异步版本,以便在单独的线程中运行每个下载/保存到数据库并等待所有线程完成,或者也许还有其他一些方法来提高此类代码的性能,您能帮忙吗我?


为了提高可扩展性(即您的 Web 应用程序可以同时处理的请求数量),您需要减少应用程序用于每个请求的线程数量。所以,而不是等待所有线程完成,您应该使用自然异步 API,它不会在操作挂起时阻塞线程。有关此的更多详细信息,请参阅here.

如果您可以使用.NET 4.5,您的具体情况可能会得到如下改进:

public void Page_Load(object sender, EventArgs e)
{
    RegisterAsyncTask(new PageAsyncTask(ProcessDataAsync));
}

public async Task ProcessDataAsync()
{
    var tasks = options.Select(v => _pi.GetDataAsync(v));
    await Task.WhenAll(tasks);
    var nodes = tasks.Select(t => t.Result);
    _dbService.SaveToDb(nodes);
}

public async Task<IList<MySampleNode>> GetDataAsync(string v)
{
    IList<MySampleNode> nodes = null;
    using (var client = new WsClient())
    {
        IEnumerable<IWsObject> wsNodes = 
            await client.getNodesAsync(new getClassLevel { code = v });
        nodes = ProcessData(wsNodes);
    }
    return nodes;
}

客户端代理WsClient可能已经有一个异步版本getNodes,称为getNodesAsync(如果没有,请检查this). ProcessDataAsync启动一堆并行非阻塞GetDataAsync任务(对于每个节点),并异步等待它们完成。这就是使该代码具有良好扩展性的原因。

你或许可以进一步提高ProcessDataAsync通过异步保存数据,即await _dbService.SaveToDbAsync(nodes),如果你可以利用异步Task基于 DB API(例如,使用EF6).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异步调用webservice并等待所有线程完成 的相关文章

  • JavaScript 中的 Promise 有什么意义?

    一个承诺是一个 可能现在可用 或将来可用 或永远不可用的值 来源 MDN 假设我有一个想要处理图片的应用程序 图片已加载 例如在算法在后台使用它之后 或某种其他类型的延迟 现在我想检查一下图片是否可以在future 通过使用承诺 而不是回调
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 使用 log4net 捕获用户名

    我目前将所有 log4net 事件写入数据库 它似乎工作得很好 为了捕获登录的用户帐户 我使用这段代码 HttpContext context HttpContext Current if context null context User
  • HTML/CSS“弹出”窗口和禁用背景

    这是一个愚蠢的问题 因为不幸的是 我无法通过搜索谷歌找到正确的关键字来获得答案 您知道当您单击链接时 背景会变暗并变得无法使用 但前景通常会有图像或登录框吗 就像雅虎邮件的图片显示方式一样 背景全部变成灰色透明 图片本身就好了 这是怎么做到
  • jqgrid colModel 中可以有 2 个格式化程序选项吗?

    我有一个 jqgrid 它有一个 column1 的自定义格式化程序 我需要将 column1 按日期排序 我知道我可以给出 格式化程序 日期 如果我给出这个 我的自定义格式化程序将不起作用 我们可以有 2 个格式化程序吗 或者还有其他选择
  • 使用 Android 测试框架进行 Android AsyncTask 测试

    我有一个非常简单的 AsyncTask 实现示例 但在使用 Android JUnit 框架测试它时遇到问题 当我在正常应用程序中实例化并执行它时 它工作得很好 但是 当它从任何 Android 测试框架类执行时 即Android测试用例
  • 为什么我在递归删除目录时遇到问题?

    我编写了一个使用 WIN32 api 创建临时目录层次结构的应用程序 现在 当关闭应用程序时想要删除目录时 我遇到了一些问题 假设我有一个目录层次结构 C temp directory subdirectory 我正在使用这个递归函数 bo
  • 无法打印更多的 pi 小数[重复]

    这个问题在这里已经有答案了 我尝试在程序中使用 long double 类型来打印更多的 pi 位数 但它只显示 5 位小数 这是我的代码 int main int argc char argv long double pi 18 acos
  • Dojo TabContainer 没有样式

    由于某种原因 样式元素未应用于 TabContainer 选项卡标题显示为纯黑底白字文本 彼此相邻
  • 如何修复此 FirebaseApp 名称 [默认] 已存在! spring-boot 和 firebase

    我正在尝试让 firebase auth 和 spring boot 为我的应用程序工作 这是我的 Application java import com google auth oauth2 GoogleCredentials impor
  • 使用 Apache POI Java NetBeans Word 文档时出现 CTPageSZ 类错误

    我尝试使用 Apache POI 和 Java 生成 Microsoft Word 文档 我对结果非常满意 直到我尝试将文档的方向更改为横向 我确实搜索并找到了一些解决方案 其中之一是 https stackoverflow com que
  • DOM 方法的短变量

    是否可以不为诸如document createElement document createTextNode element setSelectionRange etc var c document createElement var di
  • 更改 gridview 单元格中特殊单词的前景色

    我想改变一些颜色特殊词并非网格视图单元格中的所有单词 这是代码 protected void gvContents RowDataBound object sender GridViewRowEventArgs e if e Row Row
  • ImageMagick 单转换命令性能

    我有几千张图像需要处理 所以每一毫秒都很重要 每个图像的大小约为 2 3Mb 馈送到转换器的源文件 图片 jpg 从源生成的文件 orig image jpg original image 1024x768 image jpg large
  • EclEmma、Java8 和 Lambda - 不涉及 lambda 表达式

    我在 Eclipse Luna 下有一个 Java 项目 使用 EclEmma 2 3 1 201405111647 最新 它使用 Jacoco 0 7 1 它支持 Java 8 如其变更日志 2 3 1版本 2014 05 11 Fixe
  • sql每月选择前5名

    我有一个格式为 mysql 的表 我们称其为product revenue Product id 年 月 收入 我需要获取以下列 年 月 revenue top 5 monthly 其中 Revenue top 5 monthly 是当月收
  • 将excel数据导入mysql数据库[重复]

    这个问题在这里已经有答案了 我有一个 excel 文件 其中有大约 5000 行要插入到我的 mysql 数据库表之一中 任何人都可以提供快速而肮脏的解决方案吗 谢谢 又快又脏 将计算列放入 Excel 中以生成 插入 语句 然后将所有句子
  • 按列中的字符串模式拆分 data.frame

    如同按值拆分 data frame我想按值拆分 df 就我而言 该值并不总是完全相同 我尝试了这个但没有成功 df lt data frame var1 c ab 1 2 3 ac 1 2 3 4 5 6 ad 1 2 var2 1 14
  • 从 sql ExecuteScalar() 检索值

    我有以下内容 String sql SELECT FROM Temp WHERE Temp collection Program collection SqlConnection conn new SqlConnection connStr
  • Angular.js 通过单击元素以外的任意位置关闭

    这是很常见的事情 就像你在 stackoverflow 上点击收件箱一样 我将调用该对话框或任何打开的内容thing 现在我知道有两种方法可以解决这个问题 您创建了一个不可见的覆盖层 其中只有您打开的元素 有更大的 zindex 然后你关闭
  • 如何在 QCombobox 中添加分隔符样式表

    我在带有分隔符的 qcombobox 中添加了两个项目 addItem New addItem Delete insertSeparator 2 为了突出显示具有不同样式的项目的选择 我使用 QLIstView 作为 QComboBox 视
  • 异步调用webservice并等待所有线程完成

    我需要多次调用 Web 服务来获取数据 然后将这些数据放入数据库中 因此我得到了以下代码 foreach string v in options IList