Difference between revisions of "CSharp Locking and Inter Thread Communication"

From PeformIQ Upgrade
Jump to navigation Jump to search
 
Line 68: Line 68:
</pre>
</pre>


'Polling' thread could be as follows:
A 'Polling' thread would us this as follows:


<pre>
<pre>
Line 75: Line 75:
ManualResetEvent changedEvent = new ManualResetEvent(false);
ManualResetEvent changedEvent = new ManualResetEvent(false);


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


thread.Start();
worker.Start();
</pre>
</pre>




[[Category:CSharp]]
[[Category:CSharp]]

Latest revision as of 11:34, 16 March 2014

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();