【问题标题】:C# Keep threads alive until event occursC#保持线程活动直到事件发生
【发布时间】:2015-08-17 18:00:31
【问题描述】:

如何在某些事件发生之前保持线程处于活动状态?我有一个客户端线程正在等待来自服务器的消息,该消息将在客户端上引发事件(我无法更改此行为)。有多个这样的客户端在等待 MessageReceived 事件。应该有尽可能少的延迟,因此让线程休眠一段时间不是一个好的选择。

目前我想出的唯一选择是让线程在 while 循环中保持忙碌,以便在事件触发时它们处于活动状态。有没有更好的选择?

【问题讨论】:

  • 事件与线程无关(除非您有消息循环,在这种情况下您没有问题)。还是您只是要求AutoResetEvent
  • 您是否查看过事件等待句柄? albahari.com/threading/…

标签: c# multithreading events thread-sleep


【解决方案1】:

使用ManualResetEvent。你可以创建这个对象,然后使用WaitOne(),然后从另一个线程,调用Set()来释放之前的阻塞调用。

例子:

ManualResetEvent mre = new ManualResetEvent();

public void OnOneThread()
{
    //Block here until "OnAnotherThread" is done
    mre.WaitOne();
}

public void OnAnotherThread()
{
    DoWork();
    //Release the other thread
    mre.Set();
}

【讨论】:

  • 不过,我想不出办法将其应用于我的问题。谁来设置事件?我不希望主线程也在所有客户端上监听 MessageReceived 事件,然后设置它们各自的 ManualResetEvent。
  • 如果你想要一个适合你的代码的例子,你需要先放代码:)
  • @regal:如果事件在客户端触发,那么您可以让事件处理程序调用ManualResetEvent.Set() 方法。如果事件在服务器上触发......那么这完全是另一个问题。
  • 会调用事件处理程序吗?毕竟线程被ManualResetEvent阻塞了
  • 只有一种判断方式,嗯?我无法告诉你哪个线程触发了你的事件 - 很可能它在不同的线程上,它将完成你想要的。
【解决方案2】:

不知道有多大帮助,
在我曾经做过的练习中,我为处理多线程做了什么,
它更像是一种在线程之间同步的解决方案,但我想它也适合。
我使用了互斥体,并在线程调用的函数中添加了一个 WaitOne() (我认为它是这样调用的),
一旦我想要线程去,我就解锁了互斥锁。 您也可以这样做,并且可能在引发事件时解锁互斥锁。

编辑:我上面的答案说的是真的。混合上面的东西,它是 ManualResetEvent 而不是互斥锁。

不过你也可以用我写的方法,用ManualResetEvent切换互斥量即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多