Sostituzione di thread (non ThreadPool Thread) con delegati asincroni (callback).Delegati asincroni vs thread
Il mio scenario: generare un thread/del.beginInvoke() per client.
Secondo me,
Motivi
- necessità di notifica tramite richiamata/Call delegato di nuovo richiamata
- evitare un sovraccarico Filo, (delegati utilizzano filo di thread)
- Passaggio di argomenti (Evita Casting to object) e necessitano di un valore di ritorno dal metodo.
Correggimi se sopra ragioni sono sbagliate.
- Sono altri motivi?
- Quale scenario ho esattamente bisogno di fare qualcosa con i delegati asincroni che i thread non possono?
3.Performance?
Esempio
public delegate void SendCallbackType();
SendCallbackType senderdel= new SendCallbackType(SendData);
public void StartSend() // This method Could be Called more than 700 times (Thread per Client)
{
senderdel.BeginInvoke(SendCallback,null);
// (or)
Thread t = new Thread(new ThreadStart(ThreadSend));
t.IsBackground = true;
t.Start();
}
//Async Delegate
void SendData()
{
string data = QueData.DeQueue();
RaiseOnData(data); // Raise to event.
}
void SendCallback(IAsyncResult ar)
{
senderdel.BeginInvoke(SendCallback, null);
}
//Thread
void ThreadSend()
{
while (true)
{
string data = QueData.DeQueue();
RaiseOnData(data); // Raise to event.
}
}
Da quanto sopra quale opzione sarebbe la migliore. Prestazione ?
@ Darin: Grazie per la risposta.Qui il caso è l'applicazione Windows, penso che le attività puramente intensi della CPU, per quanto riguarda le prestazioni mentre si generano 1000 thread vs 1000 del.begininvoke() chiamano –
@MSK, in questo caso si consiglia di utilizzare TPL e se si utilizza una versione precedente di. NET usa il pool di thread (ThreadPool, BackgroundWorker, Async delegates, ... => finiranno comunque al ThreadPool). Non generare i thread manualmente in questa situazione. –
@ Darin: E non ho bisogno del fuoco e dimentico. Qui ho bisogno di un thread dedicato per dequeue (indipendentemente da ThreadPool) e allo stesso tempo è un processo a lunga esecuzione. –