Asynkron socket operation i C#

Tags:    asynkron socket c#

Hej udviklere.

Sidder og kigger på en lille form der opretter forbindelse til en Socket. Har en background worker der starter forbindelsen asynkront fordi jeg gerne vil have mulighed for at annullere forbindelsesforsøget. Det relevante kodestykke er her:

Fold kodeboks ind/udCSharp kode 


Det mine problemer er:
1. Jeg vil blokere background worker tråden indtil den får en cancellation request eller en forbindelse er fastslået (eller ikke). Det jeg mangler her ved kommentarerne. Et af mine problemer her er også at jeg ikke har fundet ud af hvordan man annullerer en async operation.
2. Underlig nok bliver hele programmet lukket ned, medmindre, jeg kommenterer tcpClient.EndConnect(ar);. Hvilket jeg ikke forstår siden background workeren kører i en anden tråd?
3. Hvor skal mine exception håndtering være henne? På MSDN står der 5 exceptions både for BeginConnect og for EndConnect.

På forhånd mange tak :)



Indlæg senest redigeret d. 03.06.2011 17:18 af Bruger #14645
4 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 8 karma
Sorter efter stemmer Sorter efter dato
Fik løst problemerne. Opdagede at jeg faktisk ikke havde brug for background workers siden jeg brugte asynkrone operationer. Troede fejlagtigt også at selve Callbacks'ne kørte videre i samme tråd som den der kaldte Begin* men det gør det ikke.

Fik lavet 2 dialogbokse; en til klienter og en til server. Der er 2 ting der nok bør ændres. Den ene er at jeg sætter en bool når der klikkes annuller som callbacken check fra en anden tråd, men umiddelbart virker det. Den anden at server dialog boksen begynder at lytte allerede fra constructoren og ikke først når der bliver kaldt ShowDialog. Det betyder at kan ende med en løs socket hvis man aldrig kalder ShowDialog. Nogle forslag til at løse den?

Hvis nogen er interesserede er her koden til server og klient dialogboksen. I server-version venter den bare på en forbindelse og man kan annullere. I klienten kan man skrive IP den vil forsøge at forbinde. Man kan også annullere forsøget her og starte igen. Begge bruger standard DialogResult's, OK for forbindelse oprettet, Cancel for annullering og Abort for fejl.

Klientside:
Fold kodeboks ind/udCSharp kode 


Serverside:
Fold kodeboks ind/udCSharp kode 




Indlæg senest redigeret d. 05.06.2011 12:04 af Bruger #14645
Hej Søren.

Prøv at tjekke dette link ud. Den har jeg kigget på ifm. et projekt jeg lavede med indlæsning af fotos. Jeg synes han kommer godet igennem det hele.

http://www.albahari.com/threading/part3.aspx



Tak for linket har bogmærket det.

Hvis jeg vil lukke en socket som hverken er "ikke-forbundet" eller forbundet skal jeg bare kalde dens Close metode som normalt og så håndtere ObjectDisposedException i min callback.

Angående #2: Tror måske jeg har fundet årsagen, Kan det passe at hvis en anden tråd en ens main modtager en Exception så bliver det hele lukket og debuggeren brokker sig ikke? Når jeg fanger Exception lukker det hele ikke.

Nummer #3: Stadig i tvivl om denne. Umiddelbart virker det som om at jeg skal håndtere exceptions i min callback. Men ifølge MSDN smider BeginConnect som sagt også exceptions?

#1 er stadig et problem.



Hej Søren. Undskyld jeg ikke lige giver et svar, men jeg kan desværre ikke gennemskue dine problemer lige umiddelbart. Sorry.



t