Wymiana wątków (nie wątek wątku) z asynchronicznymi delegatami (wywołania zwrotne).Asynchroniczne delegatów kontra wątki
Mój scenariusz: zaimportuj wątek/del.beginInvoke() na klienta.
Według mnie,
Powody
- konieczności powiadamiania poprzez oddzwaniania/Call delegata ponownie w zwrotnego
- Unikać Overhead gwintu (delegaci używać puli wątków wątek)
- Przekazywanie argumentów (Unikaj Casting to object) i wymaga zwracania wartości z metody.
Popraw mnie, jeśli powyższe powody są złe.
- Czy istnieją inne powody?
- W jakim scenariuszu potrzebuję zrobić coś z Asynchronicznymi Delegatami, których wątki nie mogą znaleźć się w wątkach ?
3. Wydajność?
Przykład
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.
}
}
Z powyższego która opcja najlepsze. Wydajność ?
@ Darin: Dzięki za odpowiedź.Tutaj przypadkiem jest Windows Application, myślę, że czysto CPU intensywne zadania, co o wydajności podczas tarła 1000 wątków vs 1000 del.begininvoke() zadzwoń –
@ MSK, zdecydowanie iść z TPL w tym przypadku i jeśli używasz starszej wersji. NET używa puli wątków (ThreadPool, BackgroundWorker, Async delegates, ... => one wszystkie będą w końcu w ThreadPool). Nie spawaj wątków ręcznie w tej sytuacji. –
@ Darin: I nie potrzebuję Ognia i zapomnij. Tutaj potrzebuję dedykowanego wątku do usunięcia (bez względu na ThreadPool) i jednocześnie jest to proces długotrwały. –