CSharp Locking and Inter Thread Communication

From PeformIQ Upgrade
Revision as of 11:34, 16 March 2014 by PeterHarding (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Links

bool lockWasTaken = false;
var temp = obj;
try
{
    Monitor.Enter(temp, ref lockWasTaken);
    // body
}
finally
{
    if (lockWasTaken)
    {
        Monitor.Exit(temp); 
    }
}

Another Example

Found this one here - http://stackoverflow.com/questions/505515/c-sharp-thread-safety-with-get-set

The nitty gritty:

public class Status
{
    private int _code;
    private DateTime _lastUpdate;
    private object _sync = new object();

    public int Code
    {
        get { lock (_sync) { return _code; } }
        set
        {
            lock (_sync) {
                _code = value;
            }

            // Notify listeners
            EventHandler handler = Changed;
            if (handler != null) {
                handler(this, null);
            }
        }
    }

    public DateTime LastUpdate
    {
        get { lock (_sync) { return _lastUpdate; } }
        set { lock (_sync) { _lastUpdate = value; } }
    }

    public event EventHandler Changed;
}

A 'Polling' thread would us this as follows:

Status status = new Status();

ManualResetEvent changedEvent = new ManualResetEvent(false);

Thread worker = new Thread(
    delegate() {
        status.Changed += delegate { changedEvent.Set(); };

        while (true) {
            changedEvent.WaitOne(Timeout.Infinite);
            int code = status.Code;
            DateTime lastUpdate = status.LastUpdate;
            changedEvent.Reset();
        }
    }
);

worker.Start();