2012-12-26 18 views
5

Załóżmy, że mam:wydarzenia i gwintowania

ethernet_adapter.PacketArrived += (s, e) => 
{ 
    //long processing... 
}; 

przetwarzanie może trwać długo i nie było w środku kolejna paczka dotarła. Co stanie się dalej: przetwarzanie zostanie wykonane, a następnie zostanie wywołane inne zdarzenie lub może nowe zdarzenie zostanie uruchomione natychmiast, ale w nowym wątku?

+0

Jaki typ obiektu to 'ethernet_adapter'? –

+0

@JimMischel to trzecia biblioteka typu "ICaptureDevice". Myślę, że dostałem odpowiedź. – ren

Odpowiedz

2

Nie należy zakładać. Może to być wszystko, w zależności od tego, jak wydarzenie jest wywoływane przez typ (obiektu ethernet_adapter).

Jeśli jest to operacja synchroniczna, nowe zdarzenie nie zostanie podniesione, dopóki bieżące działanie nie będzie w toku.

Jeśli jest to działanie asynchroniczne, nowe wydarzenie zostanie natychmiast podniesione.

2

Prawdopodobnie jest to operacja synchroniczna. Jedynym sposobem, w jaki ma to miejsce w innym wątku, jest to, czy obiekt, który podnosi zdarzenie, robi to w innym wątku, czy też w procedurze obsługi. Istnieje wiele sposobów, aby to zrobić, ale używanie System.Threading.Tasks.Task będzie na ogół preferowane, jeśli korzystasz z .NET 4.

Zastanów się dokładnie, jak chcesz zachować swoją aplikację. Po prostu przetworzenie każdego pakietu na nowy wątek może spowodować, że pakiety będą przetwarzane poza kolejnością. Możesz chcieć ustawić je w kolejce i mieć wątek tła, który będzie je obsługiwał w tym momencie. Lub może nie musisz nic robić.

0

można ustawić w kolejce całe zadanie w ThreadPool w następujący sposób.

ethernet_adapter.PacketArrived += (s, e) => 
{ 
ThreadPool.QueueUserWorkItem("long processing item"); 
}; 

lub możesz utworzyć zadanie (.net 4.0) dla każdego wątku.

+0

Jak to jest związane z pytaniem OP? – Tilak

+0

każdy długi element przetwarzania może być umieszczony w kolejce w wątku i będzie obsługiwany odpowiednio. Mam nadzieję, że zrozumiałem problem. – paritosh

+0

Myślę, że pytanie brzmi "jakie jest zachowanie", a nie "jak sprawić, aby obsługa asynchroniczna" – Tilak

0

Podobno istnieje metoda w klasie ethernet_adapter:

protected virtual void OnPacketArrived(PacketArrivedEventArgs e) 
{ 
    EventHandler<PacketArrivedEventArgs> handler = this.PacketArrived; 

    if (handler != null) 
    { 
     handler(this, e); 
    } 
} 

Tak długo przetwarzanie synchroniczne abonent (jak w przykładzie) będzie blokować wewnętrzny wyliczenie stosunku do wszystkich abonentów. ALE! Nie może blokować kolejnych wywołań do OnPacketArrived, jeśli ethernet_adapter wywołuje go za każdym razem w innym wątku - otrzymasz dwa równoległe długie przetwarzanie i tak dalej.

Jako przykład, spójrz na implementację Socket: to metody asynchroniczne powodują wywoływanie wywołań zwrotnych w wątkach IOCP - różne za każdym razem, gdy są w IO ThreadPool.