【发布时间】:2014-04-16 19:13:33
【问题描述】:
标题说明了一切。 await Task.Run(() => semaphore.WaitOne()); 有什么问题吗? System.Threading.Semaphore 不是线程仿射的,所以我认为不会有问题。我知道SemaphoreSlim类是可用的,但是我需要做跨进程同步,而SemaphoreSlim不做。
或者我可以/应该创建自己的 WaitHandle 自定义类型吗?
【问题讨论】:
-
这样做在技术上没有问题。您是否应该这样做取决于您的帖子中未指定的更多细节。
-
底层操作本质上是异步的,但是您有一个线程池线程同步等待异步操作,以便您可以异步指示何时完成。这通常是糟糕的设计,应尽可能避免。这表明您可能一开始就不应该使用
Semaphore。 -
这表示您的错误或有问题的设计。我怀疑是前者——你说你“需要进行跨进程同步”,但这并不会真正同步任何东西。如果调用
WaitOne的进程实际上需要知道信号量何时发出信号,为什么不同步等待呢?如果它不需要知道,那为什么还要有信号量呢? -
为了标题简洁,我省略了
await,结果是Task。我会有类似的东西:await Task.Run(() => semaphore.WaitOne()) /* Do work */或await Task.Run(() => { semaphore.WaitOne(); /* Do work */ }) -
定义“错误”。简短的回答是:是的,对于“错误”的广泛定义。可能是您以错误的方式使用信号量 - 仅基于您发布的内容,它看起来更像命名事件会更好。
WaitOne()无限期地等待,如果应用程序在信号量发出信号之前尝试退出会发生什么?如果信号量被遗弃,会发生什么?你没有处理异常。等等……
标签: c# .net multithreading thread-safety task-parallel-library