|
VB.Net-Forum - Beitragsübersicht - |
|
Thema | SON: Object freigeben |
Von |
Christian |
E-Mail |
info@pol3cat.de |
Datum |
14. Mai 2019 um 07:37:30 |
Frage |
Hallo Zusammen, ich kämpfe seit Tagen mit meiner Picturebox. Ich kopiere Bilder in ein Arbeitspfad und lösche diese wieder wenn ich diese Bilder angezeigt habe. Dann fängt alles wieder von vorne an. Problem ist nur, dass ich DeleteFile nicht erneut aufrufen kann, da irgendwas mich blockt. Habe versucht alle Verweise auf die Picturebox zu lösen, aber irgendwie komm ich so nicht weiter...
Vielleicht kann mir da jemand helfen. DankePrivate images_Screen As New List(Of Image) Private index_Screen As Integer Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork Dim worker As BackgroundWorker = CType(sender, BackgroundWorker) Do 'Until worker.CancellationPending = True If worker.CancellationPending = True Then e.Cancel = True Exit Do End If ' Lösche Bilder Try For Each foundFile As String In My.Computer.FileSystem.GetFiles(tempPfad_Screen, Microsoft.VisualBasic.FileIO.SearchOption.SearchTopLevelOnly, "*.jpg") My.Computer.FileSystem.DeleteFile(foundFile) Next Catch ex As Exception End Try ' Kopiere den Bildschirmschoner vom Copy In Temp Try For Each foundFile As String In My.Computer.FileSystem.GetFiles(Pfad_Copy_Screen, Microsoft.VisualBasic.FileIO.SearchOption.SearchTopLevelOnly, "*.jpg") My.Computer.FileSystem.CopyFile(foundFile, tempPfad_Screen & "\" & My.Computer.FileSystem.GetName(foundFile), True) Next Catch ex As Exception End Try ' Fülle Liste mit Bildern Try For Each Datei As String In My.Computer.FileSystem.GetFiles(tempPfad_Screen, FileIO.SearchOption.SearchTopLevelOnly, "*.jpg") images_Screen.Add(Image.FromFile(Datei)) Next Catch ex As Exception End Try ' Zeige Lister der Bilder nach Zeit nacheinander an Do Until index_Screen = images_Screen.Count If images_Screen.Count > 0 Then If index_Screen >= images_Screen.Count Then index_Screen = 0 End If worker.ReportProgress(100, "Nächstes Bild") System.Threading.Thread.Sleep(Zeit_Bildschirmschoner) pb_Screener.Image = Nothing pb_Screener.Image = images_Screen(index_Screen) index_Screen += 1 End If Loop 'Aufräumen und Objecte frei geben pb_Screener.Image = Nothing images_Screen.Clear() index_Screen = 0 'Beweg mal den Cursor, um Win-Bildschirmschoner nicht anzusprechen Cursor.Position = New Point(nScreenWidth, nScreenHeight) Loop End Sub Fehler bei execption bei DeleteFile{System.IO.IOException: Der Prozess kann nicht auf die Datei "C:\temp\Bildschirmschoner\0000-PSA Erweiterung - Kopie (2).jpg" zugreifen, da sie von einem anderen Prozess verwendet wird. bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) bei System.IO.File.InternalDelete(String path, Boolean checkHost) bei System.IO.File.Delete(String path) bei Microsoft.VisualBasic.FileIO.FileSystem.DeleteFileInternal(String file, UIOptionInternal showUI, RecycleOption recycle, UICancelOption onUserCancel) bei Microsoft.VisualBasic.MyServices.FileSystemProxy.DeleteFile(String file) bei WhiteBoard_Schlosserei.Whiteboard.BackgroundWorker1_DoWork(Object sender, DoWorkEventArgs e) In H:\NET Programmierung\WhiteBoard-Schlosserei\WhiteBoard-Schlosserei\Haupt.vb:Zeile 586.} |
|
Antwort: |
Von |
Nico |
E-Mail |
nico.schertler@studentpartners.de |
Datum |
19. Mai 2019 um 03:25:41 |
Antwort |
Hi,
wenn du dir mal die Dokumentation zu Image.FromFile() ansiehst, wirst du dort sehen, dass die Datei gesperrt wird, solange das Image existiert. "Existieren" heißt dabei, dass das Objekt existiert. Es ist nicht ausreichend, wenn alle Referenzen auf das Objekt entfernt werden. Dann wird zwar früher oder später der Garbage Collector dafür sorgen, dass das Objekt aufgeräumt wird, aber wann das passiert, weiß nur der Garbage Collector. Stattdessen solltest du direkt .Dispose() aufrufen. Also:For Each im In images_Screen im.Dispose() Next image_Screen.Clear() Ich vermute mal, dass das pb_Screener.Image auch in images_Screen enthalten ist. Ansonsten musst du dafür auch ein Dispose() aufrufen.
Nico |
|
[ Antwort schreiben | Zurück zum VB.Net-Forum | Forum-Hilfe ] |
|
Letzte Aktualisierung: Sonntag, 13. Dezember 2015 |
|