2015-07-13 42 views
1

我有以下WebJob:WebJob大大減慢我的網站下載下來

static void Main(string[] args) 
    { 

     Bootstrap(); //IoC container config 

     System.Diagnostics.Trace.TraceInformation("Entering the main loop"); 
     while (true) 
     { 
      OrdersFetcher.DoWork(); 
     } 
    } 

    public static class OrdersFetcher 
    { 
     const int MINIMUM_NUMBER_OF_SECONDS_BETWEEN_FETCHES = 10; 
     static DateTime _lastFetchDate = DateTime.UtcNow.AddSeconds(int.MinValue); 
     static bool _currentlyRunning = false; 

     public static void DoWork() 
     { 
      if (DateTime.UtcNow - _lastFetchDate < TimeSpan.FromSeconds(MINIMUM_NUMBER_OF_SECONDS_BETWEEN_FETCHES)) 
       return; 

      if (_currentlyRunning) 
       return; 

      _currentlyRunning = true; 
      _lastFetchDate = DateTime.UtcNow; 
      Task.Factory.StartNew(() => { FetchOrders(); }).ContinueWith((task) => 
      { 
       _currentlyRunning = false; Console.WriteLine("**** Orders Fetching Ended ****"); 
      }); 

     } 

     private static FetchOrders() 
     { 
      var db = Program.container.Resolve<MyDbContext>(); 
      //Fetch from third party and add changes to DbContext 
      db.SaveChanges(); 
      db.Dispose(); 
     } 
    } 

的WebJob被配置爲一個Singleton。

我使用的Unity和我的LifetimeManager的DbContext是PerThreadLifetimeManager。對於所有其他類型(這些類型不需要任何類型的處理)每次都會創建一個新實例。

我剛纔檢查和內存消耗正常,但CPU使用率爲100%。爲什麼是這樣的,我該如何解決它?

回答

5

嘗試:

if (DateTime.UtcNow - _lastFetchDate < TimeSpan.FromSeconds(MINIMUM_NUMBER_OF_SECONDS_BETWEEN_FETCHES)) 
       Thread.Sleep((long)DateTime.UtcNow.Substract(_lastFetchDate). TotalMilliseconds); 

代替:

if (DateTime.UtcNow - _lastFetchDate < TimeSpan.FromSeconds(MINIMUM_NUMBER_OF_SECONDS_BETWEEN_FETCHES)) 
       return; 

這樣你的線程將離開CPU做其他的東西而不是立即重試的。

+0

我沒有意識到無限循環導致100%的CPU使用率。通常,我在循環內執行的任務是長時間運行的任務。非常感謝 – reddy

1

你需要在重複呼叫之間休息你的線程。