C# 我可以使用异步编程从服务器获取数据吗?

C# 我可以使用异步编程从服务器获取数据吗?,c#,.net,multithreading,.net-4.0,C#,.net,Multithreading,.net 4.0,这就是我的情况: 我有一个帐户(用户ID/密码)通过他们的API与航空公司中央预订系统通信。 API提供了连接、断开连接、登录、注销、sendcommand和getdatareturn的方法 这是我为获取所需数据而按顺序执行的步骤 连接到主机 登录系统 发送命令以获取指定日期从一个城市到另一个城市的航班乘客列表(LD命令,带有一些参数,如航班号, 航班日期,始发城市和目的地城市对), 但在此步骤中,主机只返回完整列表的一部分(例如,它只返回20名乘客和 此列表的末尾是一个#字符,表示还有更多)

这就是我的情况: 我有一个帐户(用户ID/密码)通过他们的API与航空公司中央预订系统通信。 API提供了连接、断开连接、登录、注销、sendcommand和getdatareturn的方法

这是我为获取所需数据而按顺序执行的步骤

  • 连接到主机
  • 登录系统
  • 发送命令以获取指定日期从一个城市到另一个城市的航班乘客列表(LD命令,带有一些参数,如航班号, 航班日期,始发城市和目的地城市对), 但在此步骤中,主机只返回完整列表的一部分(例如,它只返回20名乘客和 此列表的末尾是一个#字符,表示还有更多) 如果我想要一个完整的列表,我必须发送另一个命令(MD命令)向下移动,依此类推到列表的末尾(信号位于末尾字符串) .乘客列表包含乘客姓名、等级和PRN代码,根据这些PNR代码,我必须发送另一个命令以获取乘客详细信息 比如全名,行程,联系方式。。。然后处理它(这需要花费一些时间来完成)(在这个细节中,我可以发送各种命令来获取更多信息…)
  • 退出系统
  • 断开与主机的连接
  • 我可以为#3使用多线程或并行技术从服务器获取数据吗

    Can I use multithread or parallel techonology for #2 to get data from server?
    
    它有什么作用

    在返回数据之前,您无法注销系统,最后两个步骤当然不是资源密集型的,也不依赖于您的用户界面

    实际上,您想要做的是多次发送命令,而不是多线程的任务。您只需要发送命令,直到没有检测到表示没有其他数据的符号为止

    如果你还没有这样做,那就意味着你应该这样做


    这与在控制台应用程序中读取用户输入没有什么不同。

    取决于连接类型。你是如何连接的,你是否保持连接

    如果是一对套接字保持通信(即有状态),您可以尝试创建另一个连接,再次登录,并请求所需的数据。如果它是无状态的(例如,通过HTTP),使用某种会话ID关联后续请求,那么您可以简单地同时发出多个具有相同会话ID的请求,然后看看这是否有效

    因此,通过初始连接,您请求PNR列表,然后使用该连接和新连接请求多个乘客的乘客数据,获取列表中所有乘客的所有数据

    如果实现这一目标的两个选项都不起作用,并且您坚持使用一个连接,恐怕没有其他解决方案。你能不能试着联系他们,问问这是否可行?

    恐怕我的回答是“视情况而定”。我认为客户端的并行查询没有问题,一些信息(如乘客详细信息)可能可以在单独的并行查询中完成,但获取完整列表听起来似乎应该在单个线程/连接中完成


    原因:我不知道您正在查询的系统,但听起来好像它保存了您的查询状态(他在问什么,他目前在列表的下面有多远),因此可能无法很好地处理列表中的“给我第1、2和3部分”,特别是如果第3部分不存在的话(在看到“#”之前您不知道)在第2部分的末尾,这取决于第1部分…

    那么,假设CRS允许来自同一IP的多个连接,您可以使用并行操作允许用户同时发出多个查询。例如,用户可能在屏幕上有多个“CRS”表单,因此同时处理多个查询,例如不同日期、机场、航班、pax

    正如其他海报所指出的,如果用户一次只处理一个查询,那么并行任何查询都没有多大意义(除了UI和客户端协议,这样UI就不会被锁定,从而允许查询取消)


    也就是说,考虑到这样的需求,我通常会以这样一种方式进行设计,即不管怎样,多个查询都是默认行为。我将让CRS查询表单承载与CRS交互所需的所有内容,以便在必要/可能的情况下,如果服务器支持,表单的两个实例将允许两个并发查询。这比运行两个进程更灵活。

    您可能需要清理#3。所有这些信息对这个问题真的有必要吗?您使用什么来调用所有命令?A
    HttpWebRequest
    ?您的客户提供的完整api库?我的客户提供的完整api库您不认为这可能取决于api吗?您可能需要询问您的供应商。@jgauffin-所有信息都是正确答案所必需的。虽然我同意它可以简化为几个语句,但它实际上毫无用处,因为作者提出了错误的问题。@IBC-他可能已经在自己的线程上完成了整个操作。他想在自己的线程上获取列表。他没有指出此操作阻塞主ui线程有任何问题。他正在尝试获取完整列表。他实际上并不想通过多个线程获取列表,他只是想要整个列表,至少我是这样理解他的问题的。正如我所说,他可以通过一个连接获取整个列表,然后通过多个连接发出这些请求来请求每个乘客的全部细节。他没有具体说明他想加速哪个部分。如果他的处理是瓶颈,他可以为每个接收到的乘客启动一个线程来处理并通过一个连接执行所有数据请求。如果请求数据本身速度慢,他可以尝试同时发出多个请求