6 Mart 2019

C# Thread

using System;
using System.Threading;

namespace ThreadDemo
{
    class Program
    {
        static void Main(params string[] args)
        {

            Example4(args);
            Console.ReadKey();
        }


        #region Example 0 Simple
        static void Example0(string[] args)
        {
            var t = new Thread(WriteY);
            t.Start();
            for (int i = 0; i < 1000; i++)
            {
                Console.Write("x");
            }
        }

        static void WriteY()
        {
            for (int i = 0; i < 1000; i++)
            {
                Console.Write("y");
            }
        }
        #endregion

        #region Example 1 Join And Sleep

        /*
        Join        : You can wait for another thread to end by calling its Join method
        Thread.Sleep: Pauses the current thread for a specified period

             */
        static void Example1(string[] args)
        {
            var t = new Thread(WriteY);
            t.Start();
            t.Join();
            for (int i = 0; i < 1000; i++)
            {
                Console.Write("x");
            }
            Console.WriteLine("Thread is sleeping 5 seconds");
            Thread.Sleep(TimeSpan.FromSeconds(5));
            Console.WriteLine("Waited 5 seconds");
        }
        #endregion

        #region Example 2 If threads on same instance they can share fields.

        bool done;
        static void Example2(string[] args)
        {
            var td = new Program();
            new Thread(td.Go).Start();
            td.Go();
        }

        void Go()
        {
            // it changed by another thread so it will write just once
            if (!done)
            {
                done = true;
                Console.WriteLine("Done");
            }
        }

        #endregion

        #region Example 3 Locking and Thread Safety

        static readonly object _locker = new object();

        static void Example3(string[] args)
        {
            var td = new Program();
            new Thread(td.GoThreadSafe).Start();
            td.GoThreadSafe();
        }

        void GoThreadSafe()
        {
            // it will lock thread so other thread cannot acces until this operation finished finished
            lock (_locker)
            {
                if (!done)
                {
                    done = true;
                    Console.WriteLine("Done");
                }
            }
        }

        #endregion

        #region Example 4 Signaling

        /*Sometimes you need a thread to wait until receiving notification(s) from other
thread(s). This is called signaling. The simplest signaling construct is ManualReset
Event. Calling WaitOne on a ManualResetEvent blocks the current thread until
another thread “opens” the signal by calling Set. */

        static void Example4(string[] args)
        {
            var signal = new ManualResetEvent(false);
            new Thread(() => {
                Console.WriteLine("Waiting for signal ...");
                signal.WaitOne();
                signal.Dispose();
                Console.WriteLine("Got signal!");
            }).Start();

            Thread.Sleep(TimeSpan.FromSeconds(2));
            signal.Set();
        }
        

        #endregion
    }
}