Laden...

Über Thread auf Form zugreifen

Erstellt von Alois vor 17 Jahren Letzter Beitrag vor 17 Jahren 6.572 Views
A
Alois Themenstarter:in
25 Beiträge seit 2006
vor 17 Jahren
Über Thread auf Form zugreifen

Hi,

ich möchte von einem Thread heraus auf label1.Text in einer Form zugreifen.
Wenn ich meine Anwendung starte erhalte ich immer folgende Fehlermeldung:

Eine Ausnahme (erste Chance) des Typs "System.InvalidOperationException" ist in System.Windows.Forms.dll aufgetreten.

Klammere ich die Anweisung
"mf.label1.BeginInvoke(new DelegateShowTransferBytes(ShowTransferBytes), new Object[] { nTransferBytes.ToString() });"
aus, läuft die Anwendung und eine File wird übertragen.

Erkennt jemand meinen Fehler?

Gruss Alois 😉

        
mainform.cs
        private static void LoginFTPSite()
        {
            FTPLib objFTP = new FTPLib("ftp.microsoft.com", "anonymous", "anonymous", 21);
        }

        private void toolStripButtonConnect_Click(object sender, EventArgs e)
        {
            //Neuer Thread generieren
            Thread ftpThread = new Thread(new ThreadStart(LoginFTPSite));
            ftpThread.Name = "DownloadFile";
            ftpThread.TrySetApartmentState(ApartmentState.MTA);
            ftpThread.Start();

            AddLog("Verbindung herstellen.\r\n");
        }

Desweiteren habe ich eine Klasse FTPLib über die ich über BeginInvoke von meinem Thread heraus auf das Form zugreifen will.

    delegate void DelegateShowTransferBytes(string str);

    class FTPLib
    {
        private MainForm mf = new MainForm();

        void OnTransferProgress(int nTransferBytesLo, int nTransferBytesHi)
        {
            Int64 nTransferBytes = (uint)nTransferBytesLo;
            nTransferBytes <<= 32;
            nTransferBytes += (uint)nTransferBytesHi;
            mf.label1.BeginInvoke(new DelegateShowTransferBytes(ShowTransferBytes), new Object[] { nTransferBytes.ToString() });
        }

        void ShowTransferBytes(string str)
        {
            mf.label1.Text = str;
        }

        public FTPLib(string url, string username, string password, int port)
        {
            FTPConnectionMTA _ftp = new FTPConnectionMTA();

            _ftp.OnTransferProgress += new IFTPConnectionEvents_OnTransferProgressEventHandler(OnTransferProgress);
...

Ich bin noch ein ziemlicher Neuling in Sachen C#.
Deshalb nicht gleich draufhauen, auch wenn die Frage noch so einfach erscheint.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Alois,

Control.BeginInvoke zu benutzen ist doch erforderlich und korrekt, wenn du aus einem extra Thread auf das GUI zugreifen willst. Was stört dich?

herbivore

A
Alois Themenstarter:in
25 Beiträge seit 2006
vor 17 Jahren

Stören tut mich das meine Programmzeilen nicht funktionieren.
Das Programm stürzt ab.

Weiss jemand woran das liegt?

Kann ich so aus einer Klasse auf mein form verweisen?

    class FTPLib
    {
        private MainForm mf = new MainForm();

Gruss Alois 😉

Ich bin noch ein ziemlicher Neuling in Sachen C#.
Deshalb nicht gleich draufhauen, auch wenn die Frage noch so einfach erscheint.

564 Beiträge seit 2006
vor 17 Jahren

Hallo Alois!

Für Welche Zeile zeigt der Debugger denn die Exception an? Sonst kann ich auch nur Rätselraten machen, da ich den Fehler nicht sehe 🙂

der Marcel

EDIT: Möglich wäre, dass du mit mf eine neue Instanz von MainForm erstellst, diese aber nicht die ist, die angezeigt wird, kann das sein? Du müsstest in dem Fall der Klasse mit dem Konstruktor die Referenz auf die bestehende MainForm-Instanz mitgeben.

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

A
Alois Themenstarter:in
25 Beiträge seit 2006
vor 17 Jahren

_Original von der Marcel_Für Welche Zeile zeigt der Debugger denn die Exception an?

Diese Zeile: ""mf.label1.BeginInvoke(new DelegateShowTransferBytes(ShowTransferBytes), new Object[] { nTransferBytes.ToString() });"

Vielleicht noch zu Erklärung:
Die Funktion OnTransferProgress wird von einem COM-Objekt (FTP-Client) während einer Übertragung alle 500ms aufgerufen.

Genau in diesen Abständen erscheint eine Fehlermeldung "Eine Ausnahme (erste Chance) des Typs "System.InvalidOperationException" ist in System.Windows.Forms.dll aufgetreten."

Wenn ich die Anweisung weglasse, bekomme ich keine Fehlermeldung. Muss also irgendwie mit dem Zugriff aus dem Thread auf die Form zu tun haben.

Gruss Alois 😉

Ich bin noch ein ziemlicher Neuling in Sachen C#.
Deshalb nicht gleich draufhauen, auch wenn die Frage noch so einfach erscheint.