Próbuję użyć nazwanych potoków po raz pierwszy. W dokumentacji MS stwierdzono here, stwierdza, że:NamedPipeServerStream.EndWaitForConnection() po prostu zawiesza się po użyciu
EndWaitForConnection musi być wywołana dokładnie jeden raz na każde wezwanie do BeginWaitForConnection.
Więc staram się być dobrą trochę programista i postępuj zgodnie z dokumentacją, ale EndWaitForConnection()
prostu wisi w nieskończoność, kiedy go używać.
Więc rozebrałem mój kod do absolutnego minimum, więc zobacz, czy mógłbym wyizolować problem, ale nie ma kości. Wyciągnąłem poniższy kod z klasy, którą napisałem. I zostały zmodyfikowane tak, że zaczyna oczekiwanie na połączenie rury natychmiast próbuje przestać czekać na tego połączenia rur:
private void WaitForConnectionCallBack(IAsyncResult result)
{
}
public void Start()
{
var tempPipe = new NamedPipeServerStream("TempPipe",
PipeDirection.In,
254,
PipeTransmissionMode.Message,
PipeOptions.Asynchronous);
IAsyncResult result = tempPipe.BeginWaitForConnection(
new AsyncCallback(WaitForConnectionCallBack), this);
tempPipe.EndWaitForConnection(result); // <----- Hangs on this line right here
}
1) Dlaczego to powiesić na EndWaitForConnection()
? Jeśli chcę wyłączyć serwer, zanim otrzymam połączenie, jak zasadniczo anulować to wywołanie zwrotne od BeginWaitForConnection()
?
2) Załóżmy, że nie miałem wyżej wymienionego problemu. Co się stanie, jeśli 2 klienci bardzo szybko spróbują połączyć się z moją nazwaną siecią?
Czy otrzymuję wywołanie zwrotne dla każdego z nich, czy muszę czekać na otrzymanie pierwszego powiadomienia o połączeniu, a następnie szybko ponownie zadzwonić pod numer EndWaitForConnection()
, a następnie WaitForConnectionCallBack()
, aby ponownie zacząć słuchać następnego klienta?
Ten ostatni wydaje się być dla mnie warunkiem wyścigowym, ponieważ może nie ustawić wystarczająco szybko odbiornika połączenia.
Zgodnie z projektem, to wywołanie powinno być używane tylko w metodzie wywołania zwrotnego (WaitForConnectionCallBack). Anulujesz to, wywołując funkcję tempPipe.Close(). –
Tak, ja sam doszedłem do tego wniosku. Zasadniczo odkryłem, że wywołanie funkcji tempPipe.Close() powoduje natychmiastowe wywołanie procedury wywołania zwrotnego, problem polega na tym, że ustawiłem go tak, aby natychmiast wywoływał EndWaitForConnection, ale ponieważ rura jest wtedy zamknięta, zgłasza wyjątek. Musiałem więc owinąć instrukcję try i nic nie robić w instrukcji catch. Czy to jest poprawne rozwiązanie? Wydaje mi się, że jest mi trochę niedbale, gdybym zamknął rurkę, wiedząc, że wymusi wyjątek w twoim wywołaniu zwrotnym, który będziesz musiał złapać. – Ultratrunks
To zupełnie normalne. –