Einzelnen Beitrag anzeigen

jensw_2000
(Gast)

n/a Beiträge
 
#7

AW: .Net WinForms - NULLPointer Exception beim Methodenaufruf

  Alt 27. Feb 2014, 18:23
Ja, C# kann Formulare malen und Oxygene auch. Der IL Code war nicht das Problem.
Naja .. eigentlich doch .. ziemlich genau war es das sogar .. ganz alleine
Das ich mein erster WinForms "Test", er auch für andere .Net "Lernsachen" herhalten muss.
Später werden ich den ganzen UI Kram aber auch vorrangig mit C# machen, weil es in der DevExpress Universal Subscription keine Oxygene Projektvorlagen gibt und XAF auch nur C# und VB kann.

Ich habe jetzt aber herausgefunden was ich genau vermasselt habe .
Hätte ich die paar übrigen "Variablendeklarationen" bei dem geposteten Beispielcode vorhin mal nicht weggemacht. Die waren doch wichtig.

So etwa sah das vorhin wirklich aus.
Delphi-Quellcode:
method TMainform.irgendwas;
begin
  MessageBox.show('ich bin nie zu sehen, weil Mainform.irgendwas garnicht aufrufbar ist');

  if fNextUpdateServerSersion > DateTime.Now then exit;

  var lServerVersionInfo:TServerVersionInfo;
  var lSucceeded:Boolean;

  // und zwar deshalb ...
  var lResponse: future TResponse := (async (CommonServiceClient.GetServerVersion(lServerVersionInfo)));

  if assigned(await lResponse) then begin
    //lSucceeded := lResponse.ReturnCode = TReturnCode.rcOK;
    //self.lblServerVersion.Text := if lSucceeded then lServerVersionInfo.VersionString else lResponse:Description;
    //fNextUpdateVersion := if lSucceeded then DateTime.Now.AddSeconds(90) else DateTime.Now.AddSeconds(2);
  end;
end;
Das "FUTURE" "ASYNC" "AWAIT" Konstrukt spaltet ein Task ab, die CommonClient.GetServerVersion parallel ausführt ohne das Mainform zu blockieren, und dann wieder ein im Kontext des UI Thread terminiert. Soweit die Theorie.

In der Praxis ist der "CommonServiceClient" ein Member von Mainform.
Und im Video2Brain Kurs "Multithreading mit .Net" hatte der Typ das sogar gesagt .. .
Man kann in Tasks "problemlos" auf außenliegende Variablen zugreifen kann, muss aber aufpassen, weil der IL_CODE dadurch STARK verändert wird. Die außen liegenden Variablen werden im IL Code zu Public Membern des "Task Threads" und liegen dann gar nicht mehr wirklich "außen". Das sieht man nur nicht im C# oder Pascal Code.

Unter dem Strich habe ich also eine Methode aufgerufen, die einen IL Code ausgeführt hat, welcher meine MainForm Instanz in einen Task Context gezogen hat, dessen Task aber noch garnicht instanziert war.
Resultat - MainForm weg und NullPointer Exception gerechtfertigt und die Nacht umsonst durchgesucht ...

Geändert von jensw_2000 (27. Feb 2014 um 18:34 Uhr)
  Mit Zitat antworten Zitat