0

我想在服务器上创建等待工作的线程。我希望每个访问该站点的用户有 1 个线程。它可以使用 thead.sleep(100) 创建一个 while 循环,但这似乎效率不高。我们跟踪属于每个访问者的每个任务,以便我们可以访问他们的 winform 相关对象。

所以我们需要线程,因为我们已经在 winforms 中投入了很多年,而且很多代码都在表单代码隐藏中,所以我们必须为每个用户启动 MainForm 的一个实例,并在用户访问该站点时将其保存在内存中。html UI 非常愚蠢,只响应我们的套接字提供的信号(如打开消息框或小表单)。例如,对于消息框(是/否),服务器必须等待用户选择才能继续该过程。

最初的糟糕设计迫使我们采用这种有效且快速的方法。我只想用更好的东西(更容易/更快)替换等待循环。我们不能完全重做它,因为它需要额外花费 1 年的时间来开发

也许 rx.NET 可以提供帮助,但我对此一无所知。

这里有一些相关的答案,但并不明显。

谢谢

菲利克斯

4

1 回答 1

1

如果我误读了您的问题,请纠正我,但我的理解是,当用户进行有问题的呼叫时,它涉及某种潜在的冗长 I/O。

如果您所做的只是等待某种结果,线程不是一个好的选择。创建额外的线程对 CPU 密集型工作非常有利,但如果您所做的只是等待某事发生,那么使用它们的优势就不太清楚了

您确实需要用某种异步或非阻塞 I/O 替换它。

我对这个事实的标准说明如下:假设你去一家有 10 个人的餐馆。当服务员过来时,他第一个点菜的人还没准备好;然而,其他9人是。因此,服务员向其他 9 人询问他们的订单,然后回到原来的人那里,希望他届时已经准备好点菜。(他们绝对不会让第二个服务员等待原来的人准备好点餐,这样做可能不会节省太多时间)。这就是 async/await 在许多情况下的工作方式(例外是一些任务并行库调用,如 Thread.Run(...),实际上是在其他线程上执行 - 在我们的插图中,引入了第二个服务员 - 所以确保你检查了哪个是哪个的文档)。

您需要多个服务员的情况是针对真正“受服务员约束”的任务(即服务员将成为任务的主要阻碍)。例如,如果您的餐厅有 100 张桌子,那么让一个服务员尝试为所有桌子提供服务并不明智,让服务员在接受订单后也准备食物也不明智。在这些情况下,您需要一个单独的人来烹饪食物和几个服务员。最终,您可能还需要多个厨师,可能还需要服务员等。这是您有多个线程的情况;通常,线程将服务于专门的角色(例如服务员、服务员、厨师等),并将“划分”适合其特定类别的工作(例如,每个服务员将处理几张桌子)。

但是,对于您的特定应用程序,即使您确实创建了一个新线程来处理每个用户,也有while使用and连续轮询结果更好的方法来做您想做的事情Thread.Sleep,例如ManualResetEvent类,它允许您阻止一个线程(或一组线程),直到发生特定事件(从而消除了对轮询循环的需要)。

于 2016-09-29T16:44:12.923 回答