Autor Beitrag
0belixx
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 03.11.11 15:26 
Hallo Leute,

habe folgendes Problem:

Ich versteh das mit dem Invoke einfach nicht, habe jetzt schon einiges gelesen aber....

Wenn ich folgenden Code in einen Backgroundworker setze und es kommt zu der Fehlermeldung wird natürlich angezeigt das das nicht geht, weil Label1 woanders ist. Aber wie gesagt da fehlt irgend etwas mit invoke was ich leider nicht hinbekomme

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
try
            {
                WebClient wc = new WebClient();
            WebClient client = new WebClient();
            string UpdateVersion = client.DownloadString("http://testpage/test.txt");
            }
           catch (Exception ex)
            {
                Label1.content = "Update-check error: please try again later";
            }


Danke 0belixx
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 03.11.11 16:44 
Der übliche Weg in einem Backgroundworker wäre die Exception nicht zu fangen sondern das ganze dann im RunWorkerCompleted Event zu behandeln (auch den Fehlerfall!).
0belixx Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 03.11.11 17:09 
HI,

Danke dafür.

Aber das geht auch nicht, in einer Form geht das alles, aber in WPF geht nix davon. :(
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 03.11.11 17:23 
Zitat:
Aber das geht auch nicht, in einer Form geht das alles, aber in WPF geht nix davon.


Ja dann. Schade.


Wenn du Hilfe willst musst du schon sagen was du gemacht hast und welchen Fehler du bekommst. Sonst können wir nur Mitleid bekunden.
0belixx Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 03.11.11 18:02 
Danke für das Mitleid.

Bei dem oberen Code bekomme ich die Meldung:
"Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet."

Da es in einer Windows.Form mit Label1.Invoke funktioniert es aber bei WPF kein Label1.Invoke gibt, würde ich gern wissen ob und wenn ja, ich
in WPF Invoke benutzen kann.

0belixx
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 03.11.11 18:24 
In WPF haben die entsprechenden Controls ein Dispatcher Object an dem du die Invoke Methode findest.

Wen du, wie geraten, RunWorkerCompleted benutzt hast sollte eine Threadsynchronisierung aber überflüssig sein da der Event selbst schon synchronisiert ist.
0belixx Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 03.11.11 19:16 
Hi,

danke, habe jetzt mal folgendes probiert:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
namespace update
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();
            BackgroundWorker bgw = new BackgroundWorker();
            bgw.WorkerReportsProgress = true;
            bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
            bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
            bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
            bgw.RunWorkerAsync();
        }
        static void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            
        }

        static void bgw_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            try
            {
                WebClient wc = new WebClient();
                WebClient client = new WebClient();
                wc.DownloadFile("http://testpage/test.txt", "test.txt");
            }
            catch (Exception ex)
            {
                //Fehler
            }
        }

        private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {
                Label1.Content = "Canceled!";
            }
            else if (e.Error != null)
            {
                Label1.Content = "Error: " + e.Error.Message;
            }
            else
            {
                Label1.Content = "Fertig";
            }
        }
     }
}


irgendwie ist da aber noch ein Denkfehler drin.
Das Ergebnis ist immer "Fertig" auch wenn ein Fehler angezeigt werden müsste.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 03.11.11 19:29 
Dein Backgroundworker ist immer erfolgreich da du mit dem try catch Block jede Exception einfach wegschluckst. Wie soll dann der Backgroundworker feststellen das ein Fehler aufgetreten ist? DoWork läuft so einfach ohne Exception zu Ende was das Zeichen für einen Erfolg ist. Entweder behandele die Exception richtig (also irgendwas sinnvolles im catch Block) Block und wirf die Exception dann weiter oder lasse ihn ganz weg.
0belixx Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 03.11.11 20:12 
Wie kann ich denn da einen Fehler erzeugen den der Backgroundworker erkennt? Normalerweise würde ich in dem catch einen Text irgenwo ausgebenlassen und ein break machen, geht aber wegen des Backgroundworkers nicht.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 03.11.11 20:27 
Zitat:
Wie kann ich denn da einen Fehler erzeugen den der Backgroundworker erkennt?


:?: Ich verstehe nicht ganz. Das Fehlersignal ist eine Exception. Die musst du aber auch aus der DoWork Methode raus lassen und nicht schlucken.
0belixx Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 03.11.11 20:34 
OK, falsch ausgedrückt.

Wenn ich zB nach dem Catch (Zeile 35) eingebe

e.Result = ex.Message;

sollte doch ein Fehler erkannt werden und eigentlich in Zeile 47 die ex.Message übernommen werden oder?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 03.11.11 20:42 
Nein. Wie gesagt die Exception einfach aus der Methode fallen lassen die wird dann schon automatisch vom Backgroundworker in die Error Property der RunWorkerCompletedEventArgs geschrieben. Die Exception zusätzlich auch noch in Result zu schreiben ist überflüssig.
0belixx Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 03.11.11 20:52 
Das versteh ich jetzt nicht mehr. Ich weiß nicht wie ich die Exception einfach aus der Methode fallen lassen kann.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 03.11.11 20:59 
In dem du einfach nichts tust. Mach den try..catch Block weg.
0belixx Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 03.11.11 21:07 
Na OK. Das meinst du.

Das habe ich doch am Anfang schon gemacht. Der Code läuft dann nicht durch.
Dann bekomme ich die Fehlermeldung:
"Der Remotename konnte nicht aufgelöst werden: 'testpage'"
0belixx Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 03.11.11 21:11 
Ich glaube jetzt habe ich's begriffen. Wenn ich die exe Datei ausführe dann kommt es zu der gewünschten Fehlermeldung. Ich dachte weil im Visual Studio die Fehlermeldung beim Debuggen kommt das es gar nicht hinhaut. Denke ich jetzt richtig?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 03.11.11 21:22 
Ja. Der Debugger zeigt dir die Exception standardmäßig an wenn er glaubt die wird nicht behandelt. Die wird aber natürlich im Backgroundworker behandelt und in den RunWorkerCompleted Event umgeleitet. Da der Debugger aber nicht im try .. catch Block der der sich natürlich innerhalb des Backgroundworkers um den Aufruf deiner DoWork Methode befindet halten kann (ist ja Framework Code und nicht deiner) hält er eben an der Stelle an der die Exception geworfen wird also irgendwo in deiner DoWork Methode. Das heißt aber nicht das es danach nicht wie gewünscht weiter geht. Ist als ein reines Debuggerproblemchen und nur bemerkbar wenn man debugged.
0belixx Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 03.11.11 21:27 
Na dann danke ich dir für deine Geduld!