2013-09-30 108 views
-1

我想這線程以下事件線程事件處理程序

skype.MessageStatus += new _ISkypeEvents_MessageStatusEventHandler(skype_MessageStatus); 

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

原因是這樣我就可以調用線程睡眠skype_MessageStatus沒有把主線程睡眠。

我真的不知道更好的方法來問這個問題,所以希望這已經足夠好了。

+3

你在使用'Thread.Sleep'呢? – zimdanen

+1

這看起來像是一個X/Y問題。在狀態改變的事件中沒有可以使用的Sleep()。 –

+0

原因是什麼?我正在處理那些我想要睡覺的事件。大聲笑。 –

回答

2

使用Lambda將其排列到線程池。

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

或者你也可以做兩個skype_MessageStatus方法,一種稱之爲第二使用線程池:

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

2

而不是使用Thread.sleep代碼的()考慮使用Task.Delay() method安排延遲迴調:

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