2015-09-11 45 views
0

在我的應用程序中,我正在使用線程。所以我有一個叫pull的函數,它在一個單獨的線程中運行。由於C#中的定時器而線程排隊#

var timerCall = Observable.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(1)); 
    _subscription = timerCall.Subscribe(async res => 
     { 
      List<dynamic> result = pull(); 

      if (result != null && result.Count > 0) 
       await Connection.Broadcast(new 
       { 
        id = _newestId, 
        events = result 
       }); 
     }); 

我每秒鐘都會調用線程。我使用的鎖存在,以及在我的拉動作用這樣

lock (_locker){ 
     // do stuff 
} 

讓我們假設的功能拉取每次呼叫的平均爲1.2秒,這意味着,在最後我最終會具有較大的隊列。我不需要那個。任何方式來預防它?

回答

1

有一件事我能想到。您可以使用Monitor Class來檢查是否獲取鎖。所以你可以跳過線程,如果它仍然很忙,等待另一個線程直到另一個線程完成。

+0

所以我應該做一些像Moniter.TryEnter(){}而不是鎖(_locker)? – mohsinali1317

+0

是的,如果它獲得鎖定,它將返回true。做那裏的代碼如果塊。所以如果另一個線程已經在使用這個鎖,它將跳過它,所以你不會得到一個巨大的隊列 – kevintjuh93

+0

另外,我會在線程本身中使用它,或者如果你在pull方法中使用它,則返回null。 – kevintjuh93