I'm facing a deadlock, my code structure is similar to this:
private delegate void UpdateControlDelegate(string value);
public void UpdateControl(string value)
{
    if (txtAddress.InvokeRequired)
    {
        txtAddress.Invoke(new UpdateControlDelegate(UpdateControl), value);
    }
    else
    {
        txtAddress.Text = value; // This is in GroupBox1
        txtValue.Text = value; // This is in GroupBox2
    }
}
class ThreadHandler
{
    List<string> _list = new List<string>();
    object _criticalSection = new object();
    public ThreadHandler()
    {
        new Thread(new ThreadStart(Run)).Start();
    }
    public static ThreadHandler _threadHandler = null;
    public static ThreadHandler GetThreadHandler()
    {
        if (_threadHandler == null)
        {
            _threadHandler = new ThreadHandler();
        }
        return _threadHandler;
    }
    public void Run()
    {
        while (true)
        {
            // some code
            lock (_criticalSection)
            {
                foreach (string str in _list)
                {
                    // some Code
                }
            }
            // some code
            Thread.Sleep(SomeTime);
        }
    }
    public void AddItem(string item)
    {
        lock (_criticalSection)
        {
            _list.Add(item);
        }
    }
    public void RemoveItem(string item)
    {
        lock (_criticalSection)
        {
            _list.Remove(item);
        }
    }
}
But using the same code, I just modified the UpdateControl method like this:
private delegate void UpdateControlDelegate(string value);
public void UpdateControl(string value)
{
    if (InvokeRequired)
    {
        BeginInvoke(new UpdateControlDelegate(UpdateControl), value);
    }
    else
    {
        txtAddress.Text = value; // This is in GroupBox1
        txtValue.Text = value; // This is in GroupBox2
    }
}
This is working fine. What is the problem?