【问题标题】:How to fire but don't forget in a separate thread using .NET 4.5?如何使用 .NET 4.5 在单独的线程中触发但不要忘记?
【发布时间】:2018-01-22 23:24:43
【问题描述】:

我在将某些代码转换为异步或并行工作时遇到问题。我遇到了一个异步链(async/await 在调用堆栈上行进),这导致我的 API 需要将任务返回到另一个 .NET 4.0 应用程序。

.NET 4.0 无法实现等待,因此它在 API 端强制执行 task.Result,这否定了性能改进。

在我的 API 中,我有一些对另一个 API 的调用(发送通知),我不希望在将控制权返回给我的 API 调用者之前等待(当第 3 方 api 挂起时性能缓慢)。我确实关心调用 3rd 方 API 以进行日志记录的结​​果。

使用 Task.Run 以并行方式运行这些调用显示了 UI 响应能力的巨大差异,但我担心这将创建的线程数量以及在这种情况下可能导致我的整个池死锁的超时问题。

如何在 C# .NET 4.5 中正确处理这种情况?

我可以将所有 3rd 方 API 调用从单个上下文发送到线程进行处理,而不是在每个上下文上调用 task.run 吗?

【问题讨论】:

  • 仅供参考,.NET 4.0 可以执行异步/等待。您只需要包含Microsoft.Bcl.Async NuGet 包。
  • 谢谢斯科特。 Visual Studios 2010(我正在使用)不支持它,但很高兴知道。
  • Visual Studio 2017 Community Edition 完全免费供个人使用,您可能需要考虑更新。

标签: c# .net multithreading asynchronous parallel-processing


【解决方案1】:

您可以实现一个队列来发送通知。当您需要发送通知时,您的 API 只需将通知添加到队列中即可。

然后你可以实现一个后台任务来处理队列。如果需要,您可以将此后台任务配置为使用多个线程。

【讨论】:

  • 你有什么资源可以用来实现这个行为吗?具体来说,如何将通知添加到队列以及如何配置此队列以在后台运行的示例。我看到了很多关于blockingcollection的建议。这里有什么建议吗?
  • 是的,您可以使用阻塞集合。您可以使用stackoverflow.com/questions/22688679/… 的修改版本来实现它。
  • 你会说我唯一的选择是创建和管理我自己的线程,而不是使用线程池来排队我的任务吗?我这样说是因为我需要我的线程在前台运行,以确保即使在主线程结束后也能处理任务。
  • 您不必使用线程。可以使用线程池来处理队列。
  • 我在使用线程池时遇到了问题,因为一旦主线程关闭,工作线程就会被破坏。我认为创建和管理我自己的线程来处理队列应该可以防止这种过早关闭。
猜你喜欢
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 2023-03-09
  • 2017-11-30
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多