【问题标题】:C# Task Completion SourceC# 任务完成源
【发布时间】:2019-04-02 16:55:35
【问题描述】:

我对问题陈述有一个要求,比如说,当一个事件被触发时,我必须调用一个任务完成源,使用异步和等待。将发生多个事件,并且每次发生事件时都必须调用此任务完成。 (还会发生多个任务,并提高此任务的完成度)

例如说有与这些形状相对应的几何形状和空白区域。当这些对象形状被放入这个空间时,应该触发一个事件,这会引发任务完成源。

所以想实现一个使用任务完成源的程序,根据发生的事件、依赖注入、系统事件/通知以及检查事件是否完成。(对于多个事件)。

希望我对要求很清楚,但由于问题陈述有点棘手,因为它涉及到很多 TPL Async 概念,我尽力解释,因此对上面的形状游戏进行了类比。

任何有用的建议/链接/建议都会很棒。

提前谢谢!!!..

【问题讨论】:

  • 但是您忘记提及(或者我不清楚)使用TaskCompletionSource 会解决什么问题。这似乎是X Y problem
  • 如果我有多个使用“With”或“ContinueWith”的任务,将会发生很多线程死锁。因此希望在每次事件完成或发生时实现通知触发。
  • 您有任何代码要分享,以便我们有一个起点吗?

标签: c# task-parallel-library taskcompletionsource


【解决方案1】:

一个任务完成源只能完成一次。 对于您的情况,这听起来不是正确的解决方案。看看 SemaphoreSlim,它支持异步并且是线程中立的。它会让你在每次事件发生时释放一个等待线程(WaitAsync)(一个形状被放在一个空间中)。

https://docs.microsoft.com/en-us/dotnet/api/system.threading.semaphoreslim?view=netframework-4.7.2

【讨论】:

  • 您好,感谢您的回复。但是使用“等待”就像是性能受到影响。使用任务并行库时有什么方法可以避免它?。
  • 是的,SemaphoreSlim 有一个 WaitAsync 方法,它使用 TPL 并且不会阻塞你的线程池线程。 docs.microsoft.com/en-us/dotnet/api/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多