Laden...

vshost32.exe funktioniert nicht mehr: Fehlersuche, externe dlls

Erstellt von Gimmick vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.143 Views
G
Gimmick Themenstarter:in
154 Beiträge seit 2015
vor 6 Jahren
vshost32.exe funktioniert nicht mehr: Fehlersuche, externe dlls

Hallo,

ich bin etwas erfolglos auf Fehlersuche und bräuchte ein paar Tips.

Was ich tue:

Im Prinzip rufe ich nur über einen Button mit async + await eine Methode auf, welche über eine Schleife Punkte generiert und in eine Liste packt.
Aus der Methode wird eine weitere Methode aufgerufen, die einen Teil der Punkte per Schleife kopiert und dann diese Liste in einer Schleife oft nach einem Punkt absucht.


private async void button4_Click(object sender, EventArgs e)
        {

            await Task.Run(() =>dostuff());

        }


private void dostuff()
        {

            List<Point> Punkte = new List<Point>();
            for (int i = 0; i < 3000; i++)
            {
                Point Punkt = new Point(i, i);
                Punkte.Add(Punkt);
            }
            List<Point> Ouput = LFP(Punkte[0],  Punkte);
            

        }


private List<Point> LFP(Point P, List<Point> Input)
        {

            List<Point> Punkte = new List<Point>();
            List<Point> Best = new List<Point>();
            Best.Add(P);
            bool b1 = new bool();

            
            for (int i = 0; i < 2000; i++)
            {
                Point Punkt = new Point(0, 0);
                Punkt = Input[i];
                Punkte.Add(Punkt);
            }


            for (int s = 0; s < Punkte.Count - 1; s++)
            {
                                   
                for (int j = 0; j <= 100; j++)
                {
                     
                        Point Test = new Point(0, 0);
                        b1 = Punkte.Exists(p => p.X == Test.X && p.Y == Test.Y);
                                     
                 }
            }
            

            return Best;
        }

Das sollte so doch eigentlich in Ordnung sein, oder? Mit async + await hab ich auch alles richtig gemacht?

In dem Programm befindet sich noch ein proprietärer Bildbetrachter, der bei Klick ein Bild eine Methode ausführen soll.

Das klappt solo ohne meine Methoden. Und interessanter Weise, wenn ich

b1 = Punkte.Exists(p => p.X == Test.X && p.Y == Test.Y);

rausnehme.

Sonst gibt es einen vshost32 Fehler.

Ich würde gerne sicher gehen, dass ich in den drei Methoden nichts verbockt habe, bevor ich mich beim Hersteller melde :<

T
2.224 Beiträge seit 2008
vor 6 Jahren

Der Code sieht sehr unschön aus.
Für Background Arbeiten in WinForms nimm lieber den BackgroundWorker.
async/await hier hier der falsche Ansatz, da du deine Asynchrone Operation startest und direkt darauf wartest.
Du blockierst also deine GUI und hast damit keinen Nutzen.

Hier bietet sich der BackgroundWorker schon eher an um die Operation Asynchron zu starten und per Events des BackgroundWorker auch auf die Abarbeitung zu warten ohne die GUI zu blockieren.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

D
985 Beiträge seit 2014
vor 6 Jahren

async/await hier hier der falsche Ansatz, da du deine Asynchrone Operation startest und direkt darauf wartest.
Du blockierst also deine GUI und hast damit keinen Nutzen.

Und ich dachte, das man mit async/await eben genau nicht blockiert.

Mit VS2017 läuft dieser Code einwandfrei und nicht blockierend.

T
2.224 Beiträge seit 2008
vor 6 Jahren

@Sir Rufo
Ich dachte await wartet hier auf den Abschluss des Tasks.
Dann habe ich dies wohl falsch verstanden.
Da ich eigentlich noch nie damit gearbeitet habe, kenne ich den genauen Prozess dahinter nicht.
Dann ist mein Post hinfällig, aber das eigentliche Problem ist noch offen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

4.942 Beiträge seit 2008
vor 6 Jahren

Als Erklärung:
Bei


private async void button4_Click(object sender, EventArgs e)
{
    await Task.Run(() =>dostuff());
   
    textBox.Text = "Completed";    
}

bewirkt das 'await', daß der TextBox-Text erst nach komplettem Abarbeiten der Task geändert wird - die UI wird aber währenddessen nicht blockiert (so daß der Anwender sogar nochmals diesen Button betätigen könnte).

@Gimmick: Tritt der "vshost32"-Fehler denn nur auf, wenn das externe Programm eingebunden ist, denn in deinem Code sehe ich jetzt keinen Grund dafür (auch wenn die Schleifen so unlogisch sind)? Kriegst du denn im VS eine Exception und kannst den Stacktrace sehen? Alternativ kannst du dich ja mit einer 2. VS-Instanz an den "vshost32"-Prozeß hängen und dann den Fehler provozieren.

PS: Native Datentypen initialisiert man eigentlich nicht mit new, verständlicher ist hier wohl


bool b1 = false;

G
Gimmick Themenstarter:in
154 Beiträge seit 2015
vor 6 Jahren

Die Schleifen stammen aus dem original Code. Ich habe einfach immer weiter reduziert, ohne die grundsätzliche Struktur zu ändern. Jetzt wird halt Unsinn geprüft, aber funktional ist es gleich.

Der Fehler tritt ganz konkret nur auf wenn:

Der Bildbetrachter/Thumbnaildarsteller ein Bild zeigt, ich über das zugehörige Click-Event etwas mit zugehörigem Variablenformat ausführe, dann meine Methoden aufrufe und dann Alt+Tab drücke bzw. in ein anderes Fenster klicke.

Bsp:


private void ieMulti1_Click(object sender, EventArgs e)
        {
            IEImage image = new IEImage(@"test.jpg");
        }

Das ist nach Dokumentation auch richtig so. Es reicht auch ein anderer Aufruf, eine Kopie oder sonst irgendwas im Zusammenhang mit der Bibliothek.

Solange das Fenster im Vordergrund bleibt läuft alles. Auch das nachträgliche händische Freigeben von "image" ändert nichts.

Nehme ich die List.Exists Zeile aus meinen Methoden läuft es ebenfalls problemlos.

Aufgefallen ist mir zudem: Mit weniger Punkten in der Liste kann der Fehler mit geringerer Wahrscheinlichkeit auftreten. Ausprobiert habe ich noch eine andere langwierige Operation timer/irgendwas rechnen, lief ebenfalls problemlos.

Das gleiche Problem trat zudem beim Kopieren von Bildinhalten über Bitmap.Lockbits und Marshal.Copy auf.
Habe mich dabei an die MS-Dokumentation gehalten. Der Fehler ist aber nicht so einfach zu reproduzieren, tritt also nicht immer auf.

Visual Studio zeigt mir zu dem Fehler garnichts an.
Wie ich mich mit einem zweiten VS in den Prozess hänge weiß ich nicht ^^. Werde mal schauen ob und wie das klappt.

Ich frage mich an der Stelle vorallem was bei "List.Exists" genau passiert. Wird die Liste eventuell, ähnlich bei Lockbits im Speicher gelockt, damit das schneller geht?

Edit:
Muss ich die zweite VS Instanz an den Prozess "Programmname.vshost.exe" anhängen? Da sagt er mir, dass schon ein Debugger dranhängt.

D
985 Beiträge seit 2014
vor 6 Jahren

Ich vermute mal, du hast das Beispiel zu stark zusammengestrichen.

Kann es sein, dass dein originaler Code in irgendeiner Art etwas mit dem Image veranstaltet? Das geht aus deiner Beschreibung nicht hevor, nur das da auch ein Image angezeigt wird, aber nicht ob das Image in diesem Codeteil eine weitere Rolle spielt.

G
Gimmick Themenstarter:in
154 Beiträge seit 2015
vor 6 Jahren

Ja, ist quasi maximal zusamengekürzt um nur den Fehler zu erzeugen.

Das Testprogramm besteht nur aus dem PictureViewer und zwei Buttons.

private void button1_Click(object sender, EventArgs e)
        {
            
            ieMulti1.ImageList.AppendImage(@"test.jpg");
        }
 private void ieMulti1_Click(object sender, EventArgs e)
        {
            IEImage image = new IEImage(@"test.jpg");
        }

Plus das oben erwähnte.

Das Bild wird nicht bearbeitet oder irgendwohin übergeben. Die Methoden mit der Liste sind vollkommen unabhängig davon. Es gibt keinen Schnittpunkt (außer das UI).

Es reicht auch wenn ich nur IEImage image = new IEImage(); aufrufe. Oder irgendwas anders mit bezug auf ein IEImage.

4.942 Beiträge seit 2008
vor 6 Jahren

Das deutet wirklich auf einen Fehler mit der Komponente hin und da wirst du dich dann wohl an den Hersteller wenden müssen.

Probiere aber vorher mal die Option "Enable Visual Studio Hosting Process" auszuschalten: http://vdrng.blogspot.de/2016/11/how-to-solve-vhost32exe-has-stopped.html und nochmals das Programm laufen zu lassen.