Skip to main content
 首页 » 编程设计

c#之WebJob 大大降低了我的网站速度

2024年01月26日26luoye11

我有以下 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 被配置为单例。

我使用 Unity,我的 DbContext LifetimeManager 是 PerThreadLifetimeManager。对于所有其他类型(不需要任何处理的简单类),每次都会创建一个新实例。

我刚刚检查过,内存消耗正常,但 CPU 使用率是 100%。为什么会这样,我该如何解决?

请您参考如下方法:

尝试:

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 去做其他事情而不是立即重试。