[VB.Net] Stop een backgroundworker

Pagina: 1
Acties:
  • 101 views sinds 30-01-2008
  • Reageer

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-12 12:24
In mijn applicatie maak ik gebruik van een Backgroundworker om een thread te laten runnen die een connection probeert te openen naar een database. Dit had ik eerder zonder Threads, wat er dus voor zorgde dat het leek of de applicatie hing.

Wat ik nu doe is dat ik de backgroundworker een connectie laat openen en in de RunWorkerCompleted zie ik dan wel of de connectie gelukt was of niet en aan de hand daarvan komt een meldig. Dat werkt allemaal.

Wat ik nu wil is dat de knop waarmee een databaseconnectie getest wordt, ook kan gebruiken om het proberen te connecten naar de database te stoppen, maar dit krijg ik dus gewoon niet voor elkaar.

Ik heb een aantal mogelijkheden om de backgroundworker te stoppen zoals:

Visual Basic .NET:
1
WorkerTestConnection.CancelAsync()


Dit werkt echter niet, omdat hiermee de volgende property op True wordt gezet
Visual Basic .NET:
1
WorkerTestConnection.CancellationPending


De Thread hangt op dat moment als het ware op het openen van de connectie
Visual Basic .NET:
1
2
Dim Con as System.Data.SqlClient.SqlConnection
Con.Open


Hoe krijg ik het vanuit de UI thread voor elkaar om de thread te laten stoppen? De gebruiker ziet bijvoorbeeld meteen nadat er op de 'Test Connectie' knop is gedrukt dat de ingevoerde servernaam niet klopt. Om hem i.p.v. 2 minuten te laten wachten, moet hij het meteen kunnen cancellen en de aanpassing kunnen maken.

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Volgens mij kan dit vrij eenvoudig door in de UI de Abort methode op je workerthread aan te roepen.

En dit wordt dan je code in je WorkerThread:
Visual Basic .NET:
1
2
3
4
5
6
7
Dim Con as System.Data.SqlClient.SqlConnection
Try
   Con.Open
Catch (ThreadAbortedException tae)
   ' eventuele foutafhandeling
   ' bijvoorbeeld Dispose van de connection
End Try

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-12 12:24
In de Backgroundworker zit geen method abort. Deze is wel terug te vinden in de System.Threading :)

  • mr_taipan
  • Registratie: Februari 2002
  • Laatst online: 03-12-2024
Dan zou ik een gewone thread maken en async aanroepen. Dan heb je wel een abort methode.

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Sowieso las ik net op de MSDN site dat het gebruik van de Thread.Abort moet worden vermeden. Het probleem waar jij mee zit is dat je een atomaire actie wil onderbreken. Dat dat niet op een nette manier kan lijkt me duidelijk, omdat jouw workerthread code moet wachten totdat de Open methode response teruggeeft.

Wat je ook kan doen is een Thread object en dus de Abort methode gebruiken, maar dan moet je alle afhandelingen ook zelf schrijven, terwijl dat met Backgroundworker in een mooi event systeem is gegoten. En het wordt afgeraden door Microsoft.

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Een abort wordt idd afgeraden om dat de abort gewoon gequeued wordt in het OS.

Het kan dus voorkomen dat je thread onderbroken wordt in bijvoorbeeld een finally clause met alle gevolgen van dien, af halverwege een transactie.

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...

Pagina: 1