我想在等待工作的服务器上创建线程。 我想要访问该网站的每个用户1个帖子。它使用thead.sleep(100)创建一个while循环,但似乎效率不高。我们跟踪属于每个访问者的每个任务,以便我们可以访问他们的winform相关对象。
所以我们需要线程,因为我们已经在winforms中放了很多年,而且很多代码都是代码隐藏的形式,因此我们必须为每个用户启动一个MainForm实例,并在用户访问站点时将其保留在内存中。 html UI非常愚蠢,只响应我们的socket提供的信号(比如打开消息框或小表单)。例如,对于messagebox(是/否),服务器必须等待用户选择才能继续该过程。
最初糟糕的设计迫使我们采用这种方法,并且速度很快。我只想用更好的东西(更容易/更快)替换等待循环。我们不能完全重做它,因为它需要花费1年的时间来开发
也许rx.NET可以提供帮助,但我还不知道。
有一些相关的答案here,但这并不明显。
由于
菲利克斯
答案 0 :(得分:1)
如果我误解了您的问题,请纠正我,但我的理解是,当用户进行相关调用时,它涉及某种可能冗长的I / O.
如果你所做的只是在等待某种结果,那么线程不是是一个不错的选择。创建额外的线程对于受CPU限制的工作来说非常有用,但是如果你正在做的就是等待某些事情发生的话,使用它们的好处是很多不太清楚。
您确实需要使用某种异步或非阻塞I / O替换它。
我对这个事实的标准说明如下:假设你去一家有10个人的餐馆。当服务员来的时候,他要求订购的第一个人还没准备好;然而,其他9人是。因此,服务员要求其他9个人的订单,然后回到原来的家伙,希望他到那时准备好订购。 (绝对不是这样的情况,他们会得到第二个服务员等待原来的人准备订购,这样做可能不会节省太多时间)。这就是async / await在许多情况下的工作方式(例外,一些任务并行库调用,如Thread.Run(...),实际上正在其他线程上执行 - 在我们的插图中,引入了第二个服务员 - 所以请务必查看哪个文档。
你需要多个服务员的情况是真正“服务员约束”的任务(即服务员将成为任务的主要持有者)。例如,如果您的餐厅有100张餐桌,那么让一个服务员尝试为所有餐馆服务是不明智的,服务员在接到订单后也准备食物也不明智。在这些情况下,你想要一个单独的人来烹饪食物和几个服务员。最终你可能也想要多个厨师,也许还有busboys等。这是你有多个线程的情况;通常情况下,线程会服务于专门的角色(例如服务员,公共汽车,厨师等),并且会“分割”适合其特定类别的工作(例如,每个服务员将工作几个表)。
对于您的特定应用程序,即使您做创建一个新线程来处理每个用户,也有很多更好的方法来做你想做的事情而不是连续轮询使用while
和Thread.Sleep
的结果,例如ManualResetEvent类,它允许您阻止线程(或线程组),直到特定事件发生(从而消除了需要)用于轮询循环)。