【问题标题】:.NET Tasks that wait for work [closed]等待工作的.NET任务[关闭]
【发布时间】:2016-10-05 23:17:45
【问题描述】:

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

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

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

也许 rx.NET 可以提供帮助,但我不知道。

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

谢谢

菲利克斯

【问题讨论】:

  • 网站上的Winforms相关对象?每个用户一个线程?使用 Thread.Sleep 的繁忙循环?你到底想做什么,为什么你认为多线程是一个很好的解决方案?
  • 如果您所做的只是等待某种 IO 的结果,您不想为此创建单独的线程,因为 .NET 框架已经有许多可用于非阻塞的机制我/O。
  • 谢谢,我们需要线程,因为我们已经在 winforms 中投入了很多年,而且很多代码都在代码隐藏(没有 api)中,所以我们必须为每个用户启动一个主窗体的实例并保留它在用户访问该站点时在内存中。 html UI 非常愚蠢,只响应我们的套接字提供的信号(如打开消息框或小表单)。例如,对于消息框(是/否),服务器必须等待选择
  • 我在我的问题中添加了更多信息。请重新打开:)
  • 有一个很好的方法来解决这个问题(将业务逻辑与 UI 问题分开,然后在网站中重用此逻辑)并且......无论您尝试做什么。尝试在服务器上运行 Windows 窗体应用程序,因为您的逻辑与 UI 问题严重交织在一起是行不通的。

标签: .net task rx.net


【解决方案1】:

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

线程不是如果你正在做的只是等待某种结果的好选择。创建额外的线程对 CPU 密集型工作很有好处,但如果您正在做的只是等待某事发生,那么使用它们的优势要少得多

您确实需要将其替换为某种异步或非阻塞 I/O。

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

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

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

【讨论】:

  • ManualResetEvent 很有趣,但仍然需要大量手动工作来设置线程和调用线程之间的通信
  • 谢谢,请看我的评论
猜你喜欢
  • 2021-07-17
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 2023-03-24
  • 2019-11-08
相关资源
最近更新 更多