Zu 1. Das benötigt zwei Maßnahmen:
C#-Quelltext
1: 2: 3:
| void ButtonCancelClick(object sender, EventArgs e) { worker.CancelAsync(); } |
Sobald diese Methode aufgerufen wurde, wird
BackgroundWorker.CancellationPending auf true gesetzt. Dieser Wert ist zusätzlich im eigentlichen Programmablauf abzufragen, damit Schleifen gezielt beendet werden können, z.B. innerhalb eines FileStreams:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| using(FileStream fs = new FileStream(...)) { int blocksize = 256; byte[] blockContent = new byte[blocksize]; do { fs.Read(blockContent, 0, blocksize); } while(fs.Position < fs.Length && !worker.CancellationPending); } |
Ergänzend können innerhalb von WorkerCompleted unterschiedliche Maßnahmen danach getroffen werden, ob der BackgroundWorker "normal" oder "abrupt" abgeschlossen wurde; siehe auch das Beispiel zur BackgroundWorker-Klasse in der SDK-Doku.
Gruß Jürgen