Monday, 17 February 2014

Lock C# function by arguments

Decription:

In this article, I am going to write C# code examples to Lock C# code block based on function's dynamic argument string using lock and String.Intern, lock and custom String Ref table(String.Intern replacement).

Summary:


Lock C# function by Constant String

   You can lock the C# code block by using Constant string like below method.
static void Main(string[] args)
    {
        Thread thread1 = new Thread(ThreadFunction);
        thread1.Start();

        Thread thread2 = new Thread(ThreadFunction);
        thread2.Start();
        Console.ReadLine();
    }

    static void ThreadFunction()
    {
        lock ("lockKey")
        {
            Console.WriteLine(DateTime.Now.ToString());
            Thread.Sleep(10000);
        }
    }

Lock C# code block by dynamic argument using String.Intern

   You can lock the C# function by using function's dynamic arguments. Here, you need to use String.Intern to main same string reference.
static void Main(string[] args)
    {
        string arg = "1";
        Thread thread1 = new Thread(ThreadFunction);
        thread1.Start(arg);

        string arg2 = "1";
        Thread thread2 = new Thread(ThreadFunction);
        thread2.Start(arg2);
        Console.ReadLine();
    }

    static void ThreadFunction(object arg)
    {
        lock (String.Intern(arg.ToString()))
        {
            Console.WriteLine(DateTime.Now.ToString());
            Thread.Sleep(10000);
        }
    }

Lock C# code block by fucntion's arguments using custom String Ref table

   You can lock the C# code block by using function's arguments using custom String Ref table. Here, we have replaced the String.Intern functionality by maintaining custom Dictionary.
    static void Main(string[] args)
    {
        string arg = "1";
        Thread thread1 = new Thread(ThreadFunction);
        thread1.Start(arg);

        string arg2 = "1";
        Thread thread2 = new Thread(ThreadFunction);
        thread2.Start(arg2);
        Console.ReadLine();
    }

    static void ThreadFunction(object arg)
    {
        lock (GetStringReference(arg.ToString()))
        {
            Console.WriteLine(DateTime.Now.ToString());
            Thread.Sleep(10000);
        }
    }

   static List<string> refData = new List<string>();
   static string GetStringReference(string val)
    {
        string retVal = string.Empty;
        for (int i = 0; i < refData.Count; i++)
        {
            if (refData[i].Equals(val))
            {
                retVal = refData[i];
                break;
            }
        }
        if (string.IsNullOrEmpty(retVal))
        {
            refData.Add(val);
            retVal = refData[refData.Count - 1];
        }
        return retVal;
    }


Thanks,
Morgan
Software Developer

Advertisements
Advertisements

No comments:

Post a Comment