Vorrei realizzare una successiva comunicazione tra due thread:svegliare un thread quando si verifica un evento
filettatura Alpha fa qualcosa, e quindi si sospende. Quindi il secondo thread (Beta) genera ed evento che riprende il thread Alpha. Il ciclo continua ...
Ho fatto qualcosa di simile in basso ma non sono sicuro che sia un progetto adeguato. Inoltre ho notato che Thread.Suspend()
e Thread.Resume()
sono deprecati. Non vedo l'ora di ascoltare qualche consiglio su questa implementazione e quale è il metodo preferito per sostituire i metodi deprecati.
namespace ThreadTester
{
delegate void ActionHandler();
class Alpha
{
internal Thread alphaThread;
internal void Start()
{
while (true)
{
this.alphaThread.Suspend();
Console.WriteLine("Alpha");
}
}
internal void Resume()
{
while (this.alphaThread.ThreadState == ThreadState.Suspended)
this.alphaThread.Resume();
}
}
class Beta
{
internal event ActionHandler OnEvent;
internal void Start()
{
for (int i = 0; i < 15; i++)
{
OnEvent();
Thread.Sleep(1000);
}
}
}
class Program
{
static void Main(string[] args)
{
Alpha alpha = new Alpha();
alpha.alphaThread = new Thread(new ThreadStart(alpha.Start));
alpha.alphaThread.Start();
while (!alpha.alphaThread.IsAlive) ;
Beta beta = new Beta();
beta.OnEvent += new ActionHandler(alpha.Resume);
Thread betaThread = new Thread(new ThreadStart(beta.Start));
betaThread.Start();
}
}
}
Questo è probabilmente il più vicino a rispondere al vero intento della domanda, anche se è difficile esserne certi. Il nuovo BlockingCollection è sicuramente un modo migliore per implementare questo semplice pattern Producer-Consumer piuttosto che utilizzare costrutti di sincronizzazione di basso livello direttamente. Detto questo, consiglierei all'OP di utilizzare questo modello con cautela, poiché ho visto che gli è sfuggito di mano (ho visto almeno un'applicazione con dozzine di thread che gestiscono il proprio gestore di messaggi 'Producer-Consumer' [con tre implementazioni del modello completamente diverse, nientemeno]).) –