private int WaitForThreadsInPool(ref List <ThreadInfo> threads)
 {
     while (true)
     {
         for (int i = 0; i < threads.Count; ++i)
         {
             if (!threads[i].IsAlive())
             {
                 return(i);
             }
         }
         long speed        = transferMetric.speed();
         long partDuration = speed != 0 ? (1000 * (partSize / speed)) : 0;
         long sleep        = Math.Max(Math.Min(2 * partDuration / threads.Count, 60000), 500);
         Console.WriteLine("Main Thread Waiting for Uploader Threads to finish. Sleeping for " + sleep + "ms");
         Thread.Sleep((int)sleep);
     }
 }
        private void DisplayMetrics(object state)
        {
            Process proc = Process.GetCurrentProcess();

            Console.WriteLine("Downloaded: " + Utilities.BytesToHuman(transferMetrics.bytesTransferred()) +
                              ", Parts: " + transferMetrics.partsTransferred() +
                              ", Speed: " + Utilities.BytesToHuman(transferMetrics.speed()) + "/s" +
                              ", Threads: " + threads.Count +
                              ", RAM: " + Utilities.BytesToHuman(proc.PrivateMemorySize64));
        }