Non si può battere la semplicità di una coda di messaggi bloccata. Dico, non sprecare il tuo tempo con qualcosa di più complesso.
Leggere la dichiarazione blocco.
lock
EDIT
Ecco un esempio dell'oggetto Microsoft Queue avvolto così tutte le azioni contro di essa sono sicuri thread.
public class Queue<T>
{
/// <summary>Used as a lock target to ensure thread safety.</summary>
private readonly Locker _Locker = new Locker();
private readonly System.Collections.Generic.Queue<T> _Queue = new System.Collections.Generic.Queue<T>();
/// <summary></summary>
public void Enqueue(T item)
{
lock (_Locker)
{
_Queue.Enqueue(item);
}
}
/// <summary>Enqueues a collection of items into this queue.</summary>
public virtual void EnqueueRange(IEnumerable<T> items)
{
lock (_Locker)
{
if (items == null)
{
return;
}
foreach (T item in items)
{
_Queue.Enqueue(item);
}
}
}
/// <summary></summary>
public T Dequeue()
{
lock (_Locker)
{
return _Queue.Dequeue();
}
}
/// <summary></summary>
public void Clear()
{
lock (_Locker)
{
_Queue.Clear();
}
}
/// <summary></summary>
public Int32 Count
{
get
{
lock (_Locker)
{
return _Queue.Count;
}
}
}
/// <summary></summary>
public Boolean TryDequeue(out T item)
{
lock (_Locker)
{
if (_Queue.Count > 0)
{
item = _Queue.Dequeue();
return true;
}
else
{
item = default(T);
return false;
}
}
}
}
EDIT 2
Spero che questo esempio aiuta. Ricorda che questo è ossa nude. Utilizzando queste idee di base puoi sfruttare in tutta sicurezza la potenza dei thread.
public class WorkState
{
private readonly Object _Lock = new Object();
private Int32 _State;
public Int32 GetState()
{
lock (_Lock)
{
return _State;
}
}
public void UpdateState()
{
lock (_Lock)
{
_State++;
}
}
}
public class Worker
{
private readonly WorkState _State;
private readonly Thread _Thread;
private volatile Boolean _KeepWorking;
public Worker(WorkState state)
{
_State = state;
_Thread = new Thread(DoWork);
_KeepWorking = true;
}
public void DoWork()
{
while (_KeepWorking)
{
_State.UpdateState();
}
}
public void StartWorking()
{
_Thread.Start();
}
public void StopWorking()
{
_KeepWorking = false;
}
}
private void Execute()
{
WorkState state = new WorkState();
Worker worker = new Worker(state);
worker.StartWorking();
while (true)
{
if (state.GetState() > 100)
{
worker.StopWorking();
break;
}
}
}
È possibile accedere a qualsiasi variabile nell'ambito da una discussione. per esempio. 2 thread possono chiamare la stessa funzione e accedere all'istanza del membro/alle variabili statiche. La condivisione è banale, la sincronizzazione dell'accesso alle variabili su più thread è il compito più difficile. – Gishu
Stiamo provando a leggere l'istanza dell'oggetto disponibile in un thread in un altro thread, e abbiamo una restrizione per mantenere la variabile globale/statica, c'è qualche buona idea per ottenerlo? –
Non si accede ai thread in quanto tali. Piuttosto si accede agli oggetti che i thread possono vedere. Se il codice in esecuzione in un thread può accedere a un'istanza dell'oggetto o dati statici, può modificarlo. Se un altro thread può vedere quell'istanza o dati statici, allora hai comunicato tra i due thread. – djna