public static string InstrumentedDownload(this WebRequest request, Func <WebRequest, String> downloader)
        {
            var stopwatch = Stopwatch.StartNew();

            var url = request.RequestUri.AbsoluteUri;

            Logger.LogDebug("Download", nameof(url), url, "Proxy", request.GetProxyString());

            try
            {
                var result = downloader(request);

                var kbytes = Convert.ToInt32(result.Length / 1024);
                stopwatch.Stop();
                Logger.LogInfo("Download", "KBytes", kbytes, "Result", true, "ElapsedMs", stopwatch.ElapsedMilliseconds);

                return(result);
            }
            catch (WebException e)
            {
                stopwatch.Stop();
                Logger.LogError("Download Error", e, nameof(url), url, "ElapsedMs", stopwatch.ElapsedMilliseconds);

                throw;
            }
        }
        private void CheckDeadlock()
        {
            double inactivityPeriodMs;

            lock (_statusLock)
            {
                inactivityPeriodMs = (DateTime.UtcNow - _lastStatus).TotalMilliseconds;
            }

            if (inactivityPeriodMs > TimeoutMs)
            {
                Logger.LogError("Deadlock Detected", nameof(TimeoutMs), TimeoutMs, nameof(inactivityPeriodMs), inactivityPeriodMs);
                AbortProgram();
            }
        }
 private void LogUnhandledException(object sender, UnhandledExceptionEventArgs args)
 {
     Logger.LogError("App Domain Unhandled Exception",
                     args.ExceptionObject,
                     "IsTerminating", args.IsTerminating);
 }