2009-08-26 3 views
0

Ich habe die folgende Codezeile:Wie evaluiert C# Logikblock?

public bool dcpl_radar() 
    { 
     if (radar == null) 
      return false; 
     else 
     { 
      if (radar != null) 
      { 
       if (radar.InvokeRequired) 
        radar.BeginInvoke(new MethodInvoker(delegate() 
               { 
                radar.Visible = false; 
               })); 
       else 
        this.radar.Visible = false; 

       radar = null; 
      } 
      return true; 
     }//end of else statement 
    } 

aber VStudio hält auf der invoke Linie einen Fehler werfen. Ich habe den Debugger überprüft und wenn (Radar == null) ist wahr, doch VStudio versucht, einen Teil des Codes zu bewerten, in dem es nicht sein sollte. Kann jemand erklären, warum es das bitte tut?

+1

Bitte ... bitte legen Sie alle Ihre Zahnspange. Auch dein logischer Fluss ist so verwirrend. – ChaosPandion

+0

Können Sie genauer angeben, welche Ausnahme ausgelöst wird? – joshperry

+0

Kannst du auch deine Definition für 'MethodInvoker' posten? –

Antwort

4

Warten Sie eine Minute ... Ich denke, wir haben eine Wettlaufbedingung. Sagen wir Sie BeginInvoke, fast sofort setzen Sie Radar = Null. Es ist wirklich nicht zu sagen, wenn Ihr anonymer Delegat ausgeführt wird.

Ich könnte mir vorstellen, dass dies Ihr Problem lösen sollte.

public bool dcpl_radar() 
{ 
    if (radar != null) 
    { 
     if (radar.InvokeRequired) 
     { 
      radar.BeginInvoke(new MethodInvoker(HideRadar)); 
     } 
     else 
     { 
      HideRadar(); 
     } 

     return true; 
    } 

    return false; 
} 

private void HideRadar() 
{ 
    this.radar.Visible = false; 
    this.radar = null; 
} 
+0

Das funktioniert nicht, da der Codeblock in der If-Anweisung noch ausgeführt wird, obwohl er als false ausgewertet wird. –

+0

+1 für Race-Bedingung. MethodInvoker wird höchstwahrscheinlich ausgeführt, nachdem radar = null aufgerufen wurde, so dass 'radar.Visible' eine Ausnahme auslöst. Alternativ könnten mehrere Threads das gleiche Problem verursachen. –

+0

Auch nach diesem Code kann ich eine sehr wohl erraten, dass Radar ein Feld ohne Sperren ist. – ChaosPandion

1

Was geschieht:

Der anonyme Delegaten wird, nachdem Sie setzen die radar aufgerufen wird auf null.

Wie beheben es

public bool dcpl_radar() 
{ 
    if (radar == null) 
     return false; 
    else 
    { 
     if (radar != null) 
     { 
      if (radar.InvokeRequired) 
       radar.BeginInvoke(new MethodInvoker(delegate() 
              { 
               radar.Visible = false; 
               radar = null; 
              })); 
      else { 
       this.radar.Visible = false; 
       radar = null; 
      } 


     } 
     return true; 
    }//end of else statement 
} 

(Beachten Sie, wo ich dein 'null' Zuweisungen verschoben haben).

Obwohl ich ein bisschen besorgt über den Punkt der Einstellung einer Variablen auf null bin, ist es im Allgemeinen ein Zeichen für ein schlechtes Design.

+0

Meine Vermutung ist, dass er kein Fan von Methoden ist :) – ChaosPandion

+0

Nun ..... Ich bin ein Fan von Verknüpfungen zu einem Fehler –

Verwandte Themen