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.
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
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.
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 😁 :]
_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.