2015-09-11 29 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