Confuzia despre sincronizare fir atunci când două fire apelați aceeași metodă

voturi
0

Am creat o bibliotecă Messenger și l-am făcut fir în condiții de siguranță astfel încât să poată fi partajate între fire în jurul valorii de fără griji. Am realiza acest lucru folosind cea mai mare parte a clasei Monitor.

Am o rutina de deconectare, care poate dura ceva timp pentru a finaliza, deoarece încearcă să aștepte pentru tranzacțiile care au loc înainte de a se închide priza, etc. Este asincron și a începe / metode End, dar pentru acest exemplu ne vom preface doar că e sincron.

Ce se întâmplă dacă două fire suna deconectare, unul imediat după altul? Ce ar trebui să fie faci cu al doilea fir?

În prezent, am bloc (folosind Monitor.Wait să aștepte un puls de la primul fir) până la prima logout completează și apoi arunca o AlreadyLoggedOutException.

De asemenea, am cochetat cu care au o excepție LogoutInProgress aruncată dacă Logout se numește, dar un logout are deja loc.

Ambele par să aibă avantaje și dezavantaje, dar aș vrea să știu ce alți oameni cred că este cel mai bine.

Întrebat 08/04/2012 la 23:43
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
2

Care este cea mai bună opțiune din doi ați menționat, depinde de modul în care doriți ca biblioteca să se comporte.

Nu aș arunca excepție de la consumator și pur și simplu foc final logout eveniment asincronă / metoda pentru ambele fire atunci când logout real completează. Ce sincronizare primitiv ar trebui să fie utilizați pentru a realiza acest lucru depinde de proiectarea metodei / bibliotecă. Poate dacă distribuiți mai multe detalii cu privire la metoda de a începe End-ați menționat, voi putea sugera mai bine.

Această opțiune ar fi mai ușor să programeze împotriva.

Publicat 08/04/2012 la 23:53
sursa de către utilizator

voturi
0

Există o treia opțiune: Al doilea fir încearcă să te deconectezi ar putea detecta, ca un logout deja sa întâmplat și nu fac nimic. În cazul în care contractul de „Ieșire“ este „fie să se asigure că utilizatorul este conectat, sau arunca“, atunci ar trebui să facă într-adevăr, Deconectare idempotente.

Cu toate acestea, dacă nu puteți tolera mai multe logouts pentru că ar fi o eroare de logică într-un fel ar trebui să arunce o excepție.

Publicat 09/04/2012 la 00:45
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more