2016-11-18 52 views
-1

你好,我有與後續的代碼C#的Thread.Sleep使程序滯後

  oSkype.CurrentUserStatus = TUserStatus.cusOnline; 
     Thread.Sleep(20); 
     oSkype.CurrentUserStatus = TUserStatus.cusDoNotDisturb; 
     Thread.Sleep(20); 
     oSkype.CurrentUserStatus = TUserStatus.cusAway; 
     Thread.Sleep(20); 
     oSkype.CurrentUserStatus = TUserStatus.cusInvisible; 
     Thread.Sleep(20); 

對於當它正在運行的程序的滯後,但是當我停止滯後停止某些原因的程序。 滯後不是來自電腦,因爲另一個程序仍在運行Wheel。 我能做些什麼來阻止滯後?

+5

刪除那些'thread.Sleep's! –

+0

@ M.kazemAkhgary這段代碼是在一段時間,如果我這樣做,它會改變爲快 – Pedro

+2

什麼阻止你使用像System.Timers計時器? – maximdumont

回答

2

您的滯後可能是由於UI線程在睡眠時UI無法響應。如果使用異步方法解決這個問題,使用Task.Delay很容易。 Task.Delay設置一個計時器以便稍後關閉,然後該方法恢復。這使UI線程響應:

oSkype.CurrentUserStatus = TUserStatus.cusOnline; 
await Task.Delay(20); 
oSkype.CurrentUserStatus = TUserStatus.cusDoNotDisturb; 
await Task.Delay(20); 
oSkype.CurrentUserStatus = TUserStatus.cusAway; 
await Task.Delay(20); 
oSkype.CurrentUserStatus = TUserStatus.cusInvisible; 
await Task.Delay(20); 
2

沒有更多地瞭解oyu在做什麼,答案非常簡單。讓我們來看看MSDN documentaton爲Thread.sleep代碼:

了Thread.Sleep方法(Int32)已
的.NET Framework(當前版本)其他版本 掛起的毫秒數指明當前線程。

知道這一點,預計滯後,因爲您停止當前線程一段特定時間,在這種情況下爲20 ms。

+0

我想要做的是當計時器啓動它將運行代碼,我希望程序在每個'oSkype.CurrentUserStatus' – Pedro

+0

@Pedro之間等待20ms如果你這樣做在UI線程上;它使程序「滯後」。必須在另一個線程上執行或使用async/await和Task.Delay – BradleyDotNET

0

用戶itsme86表明我搜索異步,我發現這個YouTube Link

我所做的就是在那裏我要讓創建此靜態任務

 private static Task<int> SleepAsync(int MS) 
    { 
     return Task.Run(() => 
     { 
      Thread.Sleep(MS); 
      return MS/1000; 
     }); 
    } 

那麼我只需要做的是該程序等待添加異步然後在代碼await SleepAsync(1000);

實施例:

private static Task<int> SleepAsync(int MS) 
{ 
    return Task.Run(() => 
    { 
     Thread.Sleep(MS); 
     return MS/1000; 
    }); 
} 
     private async void StatusLoopTimer_Tick(object sender, EventArgs e) 
    { 
     oSkype.CurrentUserStatus = TUserStatus.cusOnline; 
     await SleepAsync(1000); 
     oSkype.CurrentUserStatus = TUserStatus.cusDoNotDisturb; 
     await SleepAsync(1000); 
     oSkype.CurrentUserStatus = TUserStatus.cusAway; 
     await SleepAsync(1000); 
     oSkype.CurrentUserStatus = TUserStatus.cusInvisible; 
     await SleepAsync(1000); 
    } 
+0

已經有一種方法來執行此操作,「Task.Delay」。它使用計時器,因此比睡眠線程更有效。 –

+0

@mikez是的,你是正確的職位作爲回答 – Pedro