Fehlermedlung: Schutzseite kann nicht gefunden werden

  • VB.NET
  • .NET (FX) 4.0

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von StGo.

    Fehlermedlung: Schutzseite kann nicht gefunden werden

    Hallo zusammen,

    ich habe eine Frage zu einer Fehlermeldung die ich bekomme. Ich vermute das mein Dataset den Fehler verursacht. Leider finde ich nicht raus warum. Das Programm läuft ohne fehler wenn ich es als Debug oder Release Version in Visual Studio laufen lasse. Sobalt ich das Programm ohne Visual Studio laufen lasse bekomme ich folgenden Fehler:



    "Eine neueSchutzseite für den Stapel kann nicht erstellt werden."

    Wie gesagt mit VS im Hintergrund tritt dieser Fehler nicht auf. Wie könnte ich das Problem finden?

    -----------------
    Warum vermute ich das Dataset dahinter?
    1. Es ist das Herzstück des ganzen (bzw. es gibt zwei: eins für die Daten die verarbeitet werden und ein weiteres als Log).
    2. Sobald das Verarbeiten startet tritt der Fehler auf.
    3. Wenn ich die Daten importiere (XML) tritt der Fehler manchmal auf.

    Aber leider nur wenn VS nicht im Hintergrund läuft.

    Wie gehe ich so ein Problem an?

    Da ich mir nicht sicher bin ob die Information wichtig ist:
    Ich nutze die von EDR erstellten Helpers um das Dataset zwischen den Formen umzustöpseln.

    Danke
    ich hab den Fehler noch nie gesehen - keine Idee, was eine Schutzseite wohl sein mag.
    Wenn das bei iwelchen Datenverarbeitungen passiert, und du das Dataset verdächtigst - vlt. hast du iwelche listenreichen Events abonniert, und führst in den Handlern iwelchen kritischen Code aus - etwa umsortieren, oder Filter setzen, oder Primärspalten ändern - was weiß ich.

    Das ist jdfs. das einzige, was mir einfällt: eben das Events manchmal überraschende Nebenwirkungen haben können.
    OK. Danke für die Antwort.

    Ich habe nur ein Event im Programm. Werde das mal rausnehmen und schauen was passiert.

    EDIT:
    Habe ich getestet. Keine Änderung.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „StGo“ ()

    Habe inzwischen noch ein paar tests gemacht.
    Es läuft auf keinem Rechner. Auf einem Windoes Server 2008R2 incl SQL localDB Server läuft es auch nicht.

    Aber:
    Ich habe nicht nur das Event sonder auch den Timer deaktiviert. Jetzt läuft es zumindest. Ob alles funktioniert teste ich noch. Ich kann dir gegen Abend eine Version mal zukommen lassen. Dann kannst du mal reinschauen.

    Danke für deine Hilfe
    Ok du warst schneller :)

    Dahin ging gerade meine Überlegung auch. Der Timer löst einen Backgroundworker aus. Ich denke da ist meine Lösung nur bedingt gut :) Eventuell kannst du mir da einen Rat geben. Ich werde heute nachmittag dir eine version fertog machen.

    Gruß
    @EDR
    Enschuldige meine Abwesenheit. Ich habe am WE mich etwas mit den Windows eigenen Toola auseinadergesetzt. Habe mit den Fehler eingekreist:


    Beim Klick auf den Auslesen Button probiert das System mehrfach einen Thread zu erstellen. Nachdem das nicht funktioniert wird dieser wieder gekillt. Nach dem x-ten erfolglosen versuch stüzt das Programm ab.

    Hier mal ein Code Ausschnitt aus meiner Main - Backgroundworker


    VB.NET-Quellcode

    1. '##### Backgroundworker #####
    2. Private Sub Start(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAuslesenStarten.Click, cmdAuslesenAbbrechen.Click
    3. End Sub
    4. Private Sub Start() Handles cmdAuslesenStarten.Click
    5. If Not BGW.IsBusy Then
    6. If StammdatenDataSet.DtStammdaten.Count <= 0 Then
    7. MessageBox.Show("Keine Daten vorhanden", "Info", MessageBoxButtons.OK, MessageBoxIcon.Stop)
    8. Else
    9. If (From rw In StammdatenDataSet.DtStammdaten Where rw.Gelesen = 0).Count > 0 Then
    10. With Me
    11. .lblResult.Text = "Bitte warten..."
    12. .BitteWartenToolStripMenuItem.Text = "Bitte warten..."
    13. .NotifyIcon1.Text = "meinProgramm ->is running<-"
    14. .FortschrittToolStripMenuItem.BackColor = Color.FromArgb(255, 255, 153, 153)
    15. .cmdAuslesenStarten.Enabled = False
    16. .AuslesenStartenToolStripMenuItem.Enabled = False
    17. .EinstellungenToolStripMenuItem.Enabled = False
    18. .StammdatenEingebenToolStripMenuItem.Enabled = False
    19. .cmdAuslesenAbbrechen.Enabled = True
    20. .AuslesenAbbrechenToolStripMenuItem.Enabled = True
    21. .lstResult.Items.Clear()
    22. .ProgressBarAuslesen.Maximum = (From rw In StammdatenDataSet.DtStammdaten Where rw.Gelesen = 0).Count
    23. .ProgressBarAuslesen.Value = 0
    24. .BGW.RunWorkerAsync((From rw In StammdatenDataSet.DtStammdaten Where rw.Gelesen = 0).Count)
    25. End With
    26. Else
    27. Me.lstResult.Items.Add("Kein ungelesener Datensatz vorhanden")
    28. MessageBox.Show("Kein ungelesenen Dokumente vorhanden!", "Info", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    29. End If
    30. End If
    31. End If
    32. End Sub
    33. Private Sub Cancel() Handles cmdAuslesenAbbrechen.Click
    34. BGW.CancelAsync()
    35. End Sub
    36. Private Sub BGW_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGW.DoWork
    37. For i As Integer = 0 To CInt(e.Argument) - 1
    38. DatensatzHolen()
    39. BGW.ReportProgress(i)
    40. If BGW.CancellationPending Then
    41. Exit For
    42. End If
    43. Next
    44. End Sub
    45. Private Sub BGW_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BGW.ProgressChanged
    46. Me.ProgressBarAuslesen.Value = e.ProgressPercentage + 1
    47. End Sub
    48. Private Sub BGW_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BGW.RunWorkerCompleted
    49. If e.Cancelled Then
    50. lblResult.Text = "Vorgang abgebrochen"
    51. Else
    52. lblResult.Text = "Vorgang abgeschlossen"
    53. End If
    54. With Me
    55. .cmdAuslesenStarten.Enabled = True
    56. .AuslesenStartenToolStripMenuItem.Enabled = True
    57. .EinstellungenToolStripMenuItem.Enabled = True
    58. .StammdatenEingebenToolStripMenuItem.Enabled = True
    59. .cmdAuslesenAbbrechen.Enabled = False
    60. .AuslesenAbbrechenToolStripMenuItem.Enabled = False
    61. .ProgressBarAuslesen.Value = 0
    62. .FortschrittToolStripMenuItem.Text = "Fortschritt:"
    63. .BitteWartenToolStripMenuItem.Text = "-------------------------"
    64. .FortschrittToolStripMenuItem.BackColor = DefaultBackColor
    65. .NotifyIcon1.Text = "meinProgramm"
    66. End With
    67. 'Alle Excel Instanzen killen
    68. Dim CleanUp As New CleanUpClass
    69. CleanUp.CleanUp("EXCEL.EXE")
    70. LoggerDB.LoggerInfo("Durchlauf beendet", 3)
    71. End Sub


    Ich könnte dir das Projekt samt TestFiles zukommen lassen falls du mir eine PN mit deiner Mail Adresse schicken möchtest.
    Habe ein paar testFiles erstellt und eingepflegt damit du die Arbeitsweise verstehten kannst.

    Danke
    Tja, Manipulationen am Dataset (DatensatzHolen()) bewirken unzulässige threadübergreifende Zugriffe auf Steuerelemente, wenn letztere daran gebunden sind.
    Normal gibts bei solchen Zugriffen ja die berühmte InvalidOperation-Exception.
    Aber weil Databinding so indirekt funktioniert, eben nicht, mit der Folge, dass gänzlich unvorhersehbare Dinge sich ereignen können.

    Du musst die Aktualisierung aller Bindings deaktivieren, solange ein Nebenthread auf den Daten herumorgelt.

    Für Bindingsources heisst das: bs.EnableListChangedEvents=False und bs.SuspendBindings

    Und hoffen, dasses dann geht.
    nein, BindingSourceX ist nur ein Modul mit Extension-Methods.
    Sieh zu und lass dir irgendwoher das konzept der Extension-Methods fundiert erklären.
    Vlt. findest du ja auch einen guten Link für meine Link-Sammlung.

    ach - ich kann auch selber googeln: msdn.microsoft.com/de-de/library/bb384936.aspx

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Habe mich etwas informiert. Habe aber trotzdem noch ein paar Fragen:

    Wenn ich mich nicht ganz irre bindet die BindingSource ein Control an Daten.
    In meinem Fall:



    Hier im frmMain ist der oben genannte Code hinterlegt.

    Im zweiten Fenster:

    Können einträge in das DGV gemacht werden. Hier ist auch eine BindingSource vorhanden.

    Wie soll ich also die BS Suspenden wenn sie nicht vorhanden ist?

    Weiterhin finde ich hierzu nichts: bs.EnableListChangedEvents=False ich könnte BindingSource1.ListChangedEnabled = False bieten.

    EDIT: Kleine Korrektur DtStammdatenBindingSource.SuspendBinding()



    Für alle späteren Leser hier die Links zum Thema:
    msdn.microsoft.com/de-de/libra…endbinding(v=vs.110).aspx
    msdn.microsoft.com/de-de/libra…endbinding(v=vs.110).aspx
    Bilder
    • 18990396tu.jpg

      18,53 kB, 800×567, 283 mal angesehen
    • 18990397ao.jpg

      21,41 kB, 800×675, 270 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „StGo“ ()

    Könntest du für die Bilder bitte die Foreneigene Uploadfunction nutzen? So kann ich die nicht sehen.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    StGo schrieb:

    Weiterhin finde ich hierzu nichts: bs.EnableListChangedEvents=False ich könnte BindingSource1.ListChangedEnabled = False bieten.
    jo, hab ich mich verschrieben. Benutze den ObjectBrowser - da findeste schon, was ich gemeint hab.

    Ansonsten das ListChangedEnabled ist auch nicht so schlecht- das ist allerdings wieder eine Extension, und von mir.

    Allerdings soviel vb-Syntax sollteste inzwischen können, um beim Anblick der Extension und ihrer Signatur zu wissen, dass BindingSource1.ListChangedEnabled = False nicht geht.
    Hallo zusammen,

    auch auf die Gefahr hin das EDR weitere Design Fehler findet poste ich etwas mehr Code :) weil ich ehrlich nicht genau weiss wo ich das Problem anfassen muss.
    Das oft zitierete Buch von Klaus Löffelmann gibt auch nichts her und einige prblemstellungen in anderen Foren bekomme ich auch nicht auf mein Problem abgebildet.

    Kurz zu dem bisherigen Stand:
    Dank EDR ist das Problem recht "eindeutig". Der GUI Thread und der Hintergrundthread kommen sich in die Quere. Die Idee ist also die Datenbindung temporär aufzuheben:

    VB.NET-Quellcode

    1. BindingSource.RaiseListChangedEvents=False 'Ereignis für Änderungen der gebunden Liste aussetzen
    2. BindingSource.SuspendBinding() 'Datenbindung temporär unterbrechen
    3. 'Änderung an Datenfeldern....
    4. BindingSource.ResumeBinding()
    5. BindingSource.RaiseListChangedEvents=True
    6. BindingSource.ResetBindings(False)


    Soweit die Theorie!

    Mein Problem ist das ich keine BindingSource in der frmMain habe. Der Programmablauf ist folgender:

    VB.NET-Quellcode

    1. Private Sub BGW_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGW.DoWork
    2. For i As Integer = 0 To CInt(e.Argument) - 1
    3. DatensatzHolen()
    4. BGW.ReportProgress(i)
    5. If BGW.CancellationPending Then
    6. Exit For
    7. End If
    8. Next
    9. End Sub


    Der Aufruf geht nicht an ein gebundenes Control auf der Form. Sondern:

    VB.NET-Quellcode

    1. '##### Datensatz auslesen #####
    2. Private Sub DatensatzHolen()
    3. Dim rwXlsRow As DtXlsRow
    4. rwXlsRow = AeltestenDatensatzFinden()
    5. If rwXlsRow Is Nothing Then
    6. Me.Invoke(Sub() Me.lstResult.Items.Add("Kein ungelesener Datensatz vorhanden"))
    7. Me.Invoke(Sub() Me.lstResult.Items.Add("Beendet"))
    8. Else
    9. Me.Invoke(Sub() Me.lstResult.Items.Add(rwXlsRow.DtStammdatenRow.Id.ToString & ": " & IO.Path.GetFileName(rwXlsRow.DtStammdatenRow.Eingabepfad.ToString()) & "; " & rwXlsRow.DtStammdatenRow.KennzahlTag.ToString))
    10. Me.Invoke(Sub() Me.lstResult.TopIndex = lstResult.Items.Count - 1)
    11. Me.Invoke(Sub() Me.lblAnzahlVerbleibendeDokumente.Text = CStr(ProgressBarAuslesen.Value + 1 & " / " & ProgressBarAuslesen.Maximum))
    12. Me.Invoke(Sub() Me.FortschrittToolStripMenuItem.Text = CStr(ProgressBarAuslesen.Value + 1 & " / " & ProgressBarAuslesen.Maximum))
    13. Dim meinExcel As New ExcelAuslesenClass
    14. Dim arrayExcelAusgabe = meinExcel.ExcelDocAuslesen(rwXlsRow.DtStammdatenRow.Eingabepfad.ToString, rwXlsRow.DtStammdatenRow.Ausgabepfad.ToString, rwXlsRow.DtStammdatenRow.KennzahlTag.ToString, rwXlsRow.Blatt, rwXlsRow.Zelle.ToString)
    15. If arrayExcelAusgabe(7) = "0" Then
    16. Me.Invoke(Sub() Me.lstResult.Items.Add("Dokument nicht gefunden - SIEHE LOG"))
    17. End If
    18. If arrayExcelAusgabe(7) = "3" Then
    19. Me.Invoke(Sub() Me.lstResult.Items.Add("Vorhanden aber kein Tabellenblatt gefunden - SIEHE LOG"))
    20. End If
    21. Dim BildMalen As New DrawClass
    22. BildMalen.DrawImage(arrayExcelAusgabe(0), arrayExcelAusgabe(1), arrayExcelAusgabe(4), arrayExcelAusgabe(5), arrayExcelAusgabe(6))
    23. End If
    24. End Sub
    25. Private Function AeltestenDatensatzFinden() As DtXlsRow
    26. Dim rwXls As DtXlsRow = Nothing
    27. Try
    28. Dim rwStammdatenMitKleinstemDatum = From rw In StammdatenDataSet.DtStammdaten Order By rw.LetztesGelesen Ascending Where rw.Gelesen = 0
    29. Dim rwStammdaten = rwStammdatenMitKleinstemDatum.First()
    30. rwStammdaten.Gelesen = 1
    31. rwXls = GetXlsChildRow(rwStammdaten)
    32. Catch ex As Exception
    33. LoggerDB.LoggerInfo(ex, 1)
    34. LoggerDB.LoggerInfo("Kein ungelesener Datensatz vorhanden!!!", 3)
    35. End Try
    36. Return rwXls
    37. End Function
    38. Private Function GetXlsChildRow(rwStammdaten As DtStammdatenRow) As DtXlsRow
    39. Return (From rwXls In rwStammdaten.GetDtXlsRows).Last
    40. End Function


    Ich würde mich freuen wenn jemand etwas Licht in die Sache bringen würde. Falls jemand also eine Idee hat wo ich mich in dieser Richtung belesen könnte freue ich mich über eure Links.

    Dnake