static void Main(string[] args)
        {
            // CONSTRUCTORS
            ConcurrentBag <int>    cbag = new ConcurrentBag <int>(new int[] { 1, 2, 4, 7, 12, 222 });
            ConcurrentBag <string> cb   = new ConcurrentBag <string>();

            // PROPERTIES
            Console.WriteLine("Count = {0}", cb.Count);        // 0
            Console.WriteLine("Is cb empty? {0}", cb.IsEmpty); // true

            // FUNCTIONS
            cb.Add(item: "cow");
            cb.Add(item: "chicken");
            cb.Add(item: "duck");
            cb.Add(item: "sheep");

            Console.WriteLine("cb = ");
            foreach (string s in cb)
            {
                Console.Write("{0}, ", s);
            }                                                       // {"cow", "chicken", "duck", "sheep"}
            Console.WriteLine();

            // cb.Clear();
            cb = new ConcurrentBag <string>();
            Console.WriteLine("cb after clear is empty? {0}", cb.IsEmpty); // true

            cb.Add(item: "Germany");
            cb.Add(item: "Spain");
            cb.Add(item: "Sweden");
            cb.Add(item: "Serbia");

            string[] arr = new string[cb.Count];
            cb.CopyTo(array: arr, index: 0);
            Console.WriteLine("arr = ");
            foreach (string s in arr)
            {
                Console.Write("{0}, ", s);
            }                                                        // {"Germany", "Spain", "Sweden", "Serbia"}
            Console.WriteLine();

            ConcurrentBag <string> cb_copy = new ConcurrentBag <string>(cb);

            Console.WriteLine("cb is equal to its copy? {0}", cb.Equals(cb_copy)); // true

            IEnumerator <string> en = cb.GetEnumerator();

            Console.Write("cb = ");
            while (en.MoveNext())
            {
                Console.Write("{0}, ", en.Current);
            }
            Console.WriteLine();

            Console.WriteLine("cb hashcode = {0}", cb.GetHashCode());

            Console.WriteLine("cb type = {0}", cb.GetType().FullName);

            arr = cb.ToArray();
            Console.WriteLine("arr afteer using ToArray on cb = ");
            foreach (string s in arr)
            {
                Console.Write("{0}, ", s);
            }                                                        // {"Germany", "Spain", "Sweden", "Serbia"}
            Console.WriteLine();

            Console.WriteLine("string version of cb = {0}", cb.ToString());

            string result_str;

            Console.WriteLine("peeking = {0}", cb.TryPeek(result: out result_str)); // true
            Console.WriteLine("peeking result = {0}", result_str);

            // Console.WriteLine("taking = {0}", cb.TryTaking(result: out result_str)); // true
            // Console.WriteLine("taking result = {0}", result_str);

            // Threading
            int    num       = 0;
            Thread threadAdd = new Thread(() => {
                for (int i = num; i < num + 10; i++)
                {
                    cb.Add(item: i.ToString());
                    Console.WriteLine("threadAdd: {0}", i);
                }
                num += 10;
                Console.WriteLine();
            });
            Thread threadAddWord = new Thread(() => {
                for (int i = 1; i < 10; i++)
                {
                    cb.Add(item: "Word");
                    Console.WriteLine("threadAddWord: {0}", i);
                }
                Console.WriteLine();
            });

            Thread threadFinal = new Thread(() => {
                Console.WriteLine("cb after threading = ");
                foreach (string s in cb)
                {
                    Console.Write("{0}, ", s);
                }
                Console.WriteLine();
            });

            threadAdd.Start();
            threadAddWord.Start();
            threadAdd.Join();
            threadAddWord.Join();
            threadFinal.Start();
        }