C#多线程查询

6
我正在尝试用C#编写一个程序,它将连接到大约400台计算机并检索一些信息,比如说它将检索每台计算机上运行的Web服务列表。我假设我需要一个良好的线程化应用程序才能快速从这么多服务器中检索信息。我对如何开始处理此问题毫无头绪,请问你们能否给我一个起点!谢谢!

1
为什么你假设需要多线程?为什么不一个接一个地访问它们? - Oded
不仅是一个假设,你可以说这是一条规则已经被赋予给我了,我已经被指示将应用程序进行多线程处理。如果我错了,请纠正我,如果我进行阻塞调用,一些服务器可能需要很长时间才能返回响应,但也可能有更快的服务器能够在此期间返回结果。希望这样讲清楚了。 - Aadi Droid
@zabulus,仅限客户端,我已经为单服务器模型编写了控制台应用程序。现在需要从1个系统扩展到大量的系统! - Aadi Droid
你希望响应几乎同时到达,还是直接遍历计算机列表更合理? - agent-j
可以在没有多线程的情况下使用非阻塞调用。 - CodesInChaos
显示剩余3条评论
6个回答

5

我认为在主逻辑中使用线程没有必要。使用异步API并将它们的回调安排到主线程中。这样,您可以获得异步性的好处,但不需要处理与线程相关的大部分困难。

只有当您需要处理的数据工作非常昂贵时,才需要在逻辑代码中使用多线程。即使在这种情况下,通常也可以通过并行化使用无副作用函数来完成。


谢谢你的想法,我一定会采用你提出的方法。只要我的结果出来了,我会尽快回复你。 - Aadi Droid
使用异步API不等同于使用线程,这种说法有些简化了。虽然明确的线程被抽象掉了,但是由于异步API的回调很可能会在不同的线程上发生,因此它仍然存在着许多显式多线程所面临的问题。 - spender
  1. 有非阻塞API,完全不使用线程
  2. 即使您使用的API具有在不同线程上回调的功能,您也可以将其安排到主线程上。例如,在适当的同步上下文中使用“Post”方法。
- CodesInChaos
嘿,我有一个小问题,希望你能尽快看到,因为我很快就要开始工作了。那么,有没有一种方法可以知道从哪个来源返回异步调用的数据?我的意思是,我有多个服务器,当数据返回时,我能够区分信息来自哪个服务器吗? - Aadi Droid
1
我从来没有使用过这些异步API。但通常当你在某个地方订阅一个事件时,你可以传递一个userdata对象,或者使用委托的this作为userdata。 - CodesInChaos

2

1

当OP谈论消耗Web服务时,会出现哪些性能问题? - Predator
他正在寻找完成工作的最佳方式。他想要执行的操作似乎彼此独立。你不觉得将它们并行执行是有意义的吗? - Unmesh Kondolikar
Joe Albahari的线程页面非常棒,是一个非常扎实的入门指南。 - spender

0
在哪里以及如何获取要查询的这400个服务器列表?
你需要多久执行一次?
你可以使用Windows服务或计划任务来调用你的软件,然后在其中对服务器列表中的每个元素执行一个调用,使用线程队列/池在不同线程中启动调用到这样的服务器,但有一个最大值,所以你不会同时启动400个线程。
更好地描述你的解决方案,我们看看你能做什么 :)

服务器列表是已经存在的 SQL Server 数据库的一部分。它就像一个独立的应用程序,所以不需要安排计划,我可能会根据需要每天运行一次或其他频率。这更像是一个一致性检查工具,是我的目标。 - Aadi Droid
好的,我仍然不会把逻辑放在UI中,而是放在一个类库中,这样你就可以进行单元测试,在Windows前端或Web页面中使用,并且将来也可以轻松地进行调度。在我看来,你得到的其他答案也很好。 - Davide Piras
关于UI与逻辑分离的观点,我没有理解清楚。我想创建一个可视化报告,指出不一致之处的位置。我觉得我需要重新表达我的问题...简单来说,我有一个由10个服务器组成的集群,这个集群的主要特点是每个服务器都有一个本地副本,文件的类型可以是.svc或者.asmx,并且所有数据都是相同的。现在当我运行我的工具时,我需要能够获取这些服务的信息,并检查是否有任何服务器的数据异常。如果有异常,那么我需要以可视化的方式显示错误的位置。 - Aadi Droid

0

看看这个库:任务并行库。你可以更有效地利用系统资源,比直接管理线程更容易地管理你的工作。


0

当你开始查询所有400台计算机时,服务器端可能会受到相当大的影响。但是你可以看一下Parallel LINQ(PLINQ),在那里你可以限制并行度

你也可以使用线程池,例如Task类。

手动创建线程可能不是一个好主意,因为它们不太可重用,并且需要相当多的内存/CPU来创建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接