2009-04-25 3 views
0

Ich kann es nicht glauben, das funktioniert in meiner anderen Anwendung, aber in diesem, die ähnliche Struktur hat - tut es nicht!Rufen Sie aus anderen Thread

public string ListAdd 
    { 
     set 
     { 
      if (listView1.InvokeRequired) 
      { 
       this.Invoke((MethodInvoker)delegate 
       { 
        listView1.Items.Add(value); 
       }); 
      } 
      else 
      { 
       listView1.Items.Add(value); 
      } 
     } 
    } 

So wie ich es nennen:

 var formz = Form.ActiveForm as Form1; 
     if (formz != null) 
      formz.ListAdd = "asdasdasdasd"; 

Wenn ich es von der Funktion aufrufen, wo ich Paket empfangen über TCP (ich es auf dem Listview setzen wollen) - Es passiert nichts, aber wenn ich nenne es in derselben Klasse, in der ich WinSock initialisiere - es funktioniert.

Wo könnte das Problem liegen?

EDIT: Ich habe gerade die Anwendung debugged, Formz ist null an der Stelle, die ich es nenne (Funktion empfangen). Warum ist es dort Null, aber an keinem anderen Ort?

+0

Sie sollten in einem Property-Setter keine Arbeit wie diese ausführen. Erwägen Sie, sie in eine Methode zu ändern. –

Antwort

2

Ich denke nicht, es wird Ihr Problem lösen, aber haben Sie darüber nachgedacht, das folgende Muster zu verwenden, um die Invoke auszuführen? Ich halte es für viel lesbarer. Erstellen Sie diese Erweiterungsmethode.

public static class ControlExtension 
{ 
    public static void ThreadSafeInvoke(this Control control, MethodInvoker method) 
    { 
     if (control != null) 
     { 
     if (control.InvokeRequired) 
     { 
      control.Invoke(method); 
     } 
     else 
     { 
      method.Invoke(); 
     } 
     } 
    } 
} 

Und dann können Sie thread-sichere Methodenaufrufe wie folgt durchführen.

Form form = new Form(); 

form.ThreadSafeInvoke(() => form.Text = "ThreadSafeInvoke"); 

Oder mehrere Anrufe gleichzeitig.

form.ThreadSafeInvoke(() =>     
{ 
    form.Text = "ThreadSafeInvoke"; 
    form.Visible = true; 
    form.WindowState = FormWindowState.Maximized; 
}); 

UPDATE

So ist das Problem Form.ActiveForm Rückkehr null deutlich.

  1. Zum Zeitpunkt des Anrufs ist kein aktives Formular vorhanden.
  2. Der Thread hat keine Berechtigung, das aktive Formular zu erhalten - MSDN gibt an, dass UIPermission erforderlich ist.
1

Wenn ActiveForm null zurückgibt, haben Sie möglicherweise kein aktives Formular oder es ist nicht vom Typ Form1. Sie verwenden "as Form1". Wenn Sie also ein Form2 haben, das aktiv ist, wird formz auf null gesetzt.

Können Sie Formz in die Funktion übergeben, anstatt ActiveForm aufzurufen?

+0

Ich habe nur ein Formular, und ich verwende async (WSAAsyncSelect()), um meine Verbindungen zu tun. Nein, ich kann Form1 keiner var zuweisen, die noch nicht initialisiert wurde. –

+0

Was gibt Form.ActiveForm zurück? Null oder eine Form eines anderen Typs als Form1? –

+0

null //Comment.length = 15; –

0

Überprüfen Sie, ob Sie im Debug-Modus sind; Wenn dies der Fall ist, ist der zurückgegebene aktive Wert null.