线程事件处理程序

时间:2013-09-30 22:11:23

标签: c# multithreading events

我想在下面的事件中解决这个问题

skype.MessageStatus += new _ISkypeEvents_MessageStatusEventHandler(skype_MessageStatus);

private void skype_MessageStatus(ChatMessage msg, TChatMessageStatus status)
{
}

原因是我可以在skype_MessageStatus中调用线程休眠,而不会让主线程处于休眠状态。

我真的不知道一个更好的方式来问这个,所以希望这已经足够了。

2 个答案:

答案 0 :(得分:2)

使用Lambda将其排队到线程池。

skype.MessageStatus += m => ThreadPool.QueueUserWorkItem(_ => skype_MessageStatus(m));

或者您可以创建两个skype_MessageStatus方法,一个使用ThreadPool调用第二个方法:

skype_MessageStatus += skypeMessageStatus;

private void skype_MessageStatus(m) 
{
    ThreadPool.QueueUserWorkItem(skype_MessageStatusImpl, m);
}                               

private void skype_MessageStatusImpl(object m)
{
    ...
}

最佳做法是不使用Thread.Sleep而是设置计时器。有关.NET中的各种计时器,请参阅http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

答案 1 :(得分:2)

不要使用Thread.Sleep()而是考虑使用Task.Delay() method来安排延迟回调:

 skype.MessageStatus += (sender, args)=> 
      Task.Delay(TimeSpan.FromSeconds(10)).ContinueWith((t)=> CallAfterDelay());