我想在服务器上创建等待工作的线程。我想要1线程每个用户访问该网站。它可以用head.sleep(100)创建一个while循环,但这似乎效率不高。我们跟踪属于每个访问者的每个任务,以便我们可以访问他们的窗体相关对象。
所以我们需要线程,因为我们在winforms上投入了很多年,很多代码都在forms代码后面,所以我们必须为每个用户启动一个MainForm实例,并在用户访问网站时将其保存在内存中。html UI非常愚蠢,只是响应套接字提供的信号(比如打开消息框或小表单)。例如,对于消息框(是/否),服务器必须等待用户选择才能继续处理。
最初的糟糕设计迫使我们采用这种有效且快速的方法。我只想用更好(更容易/更快)的东西取代等待循环。我们不能完全重做,因为开发它需要额外花费1年的时间
也许rx。. NET可以提供帮助,但我不知道。
这里有一些相关的答案,但不是很明显。
感谢菲利克斯如果我误解了你的问题,请纠正我,但我的理解是,当用户进行有问题的呼叫时,它涉及某种潜在的冗长I/o。
如果您所做的一切都是在等待某种结果,那么线程不是是一个好的选择。创建额外的线程对于cpu密集型工作来说是很好的,但是如果你所做的一切都是在等待某些事情发生,那么使用它们的好处就不那么明显了。
你真的需要用某种异步或非阻塞I/o来代替它。
我对这一事实的标准说明如下:假设你去一家有10个人的餐馆。当服务员经过时,他问的第一个人还没有准备好;然而,另外9个人是。因此,服务员向其他9个人要了他们的菜,然后回到原来的那个人身边,希望他能在那之前准备好点餐。(他们绝对不会再找一个服务员来等原来的服务员来点餐,而且这样做可能也不会节省多少时间)。这就是async/await在许多情况下的工作方式(例外的是一些任务并行库调用,比如Thread.Run(…),实际上是在其他线程上执行的——在我们的例子中,引入了第二个服务员——所以请确保检查文档,以确定哪个是哪个)。您需要多个服务员的情况是对于真正的"服务员绑定"的任务(即服务员将是任务的主要阻塞者)。例如,如果你的餐厅有100张桌子,让一个服务员为所有人服务是不明智的,也不明智的是让服务员在接受订单后也准备食物。在这种情况下,你会希望有一个单独的人做饭和几个服务员。最后,你可能还需要多个厨师,也许还有杂工等等。在这种情况下,你会有多个线程;一般来说,线程将服务于特定的角色(例如,服务员,服务员,厨师等),并将"划分"适合他们特定类别的工作(例如,每个服务员将工作几张桌子)。
对于您的特定应用程序,尽管确实创建了一个新线程来处理每个用户,但是比起使用while
和Thread.Sleep
连续轮询结果,还有更好的方法,例如ManualResetEvent类,它允许您阻塞一个线程(或一组线程),直到特定事件发生(从而消除了轮询循环的需要)。