2016-04-27 7 views
0

Ich habe ein MDI mit einem Formular, das von einem der Menüs öffnet.Wie zeige ich das Formular in einem MDI beim asynchronen Laden von Datenwerten an?

Dieses Formular enthält ein Kombinationsfeld, das mit Werten gefüllt wird, die aus einer SQL-Abfrage abgerufen werden.

Im Moment, wenn ich versuche, das Formular zu öffnen, gibt es eine Verzögerung von ein paar Sekunden, da das Formular die Abfrage auslöst, um die Werte zurück zu erhalten, um das Kombinationsfeld zu füllen.

Gibt es eine Möglichkeit, das Formular zu öffnen und die Werte später zu füllen?

Ich habe einen Event-Handler auf der Last für die Form mit dem folgenden:

private async void RerunForm_Load(object sender, EventArgs e) { 
     await this.LoadDataAsync(); 
} 

wo die LoadDataAsync() Methode wird als:

private async void LoadDataAsync() { 
     this._batchCollection = await repo.RetrieveBatchesAsync(); 
     this.lblLoading.Visible = false; 


     this.cbBatchesToRun.DataSource = this._batchCollection; 
     this.cbBatchesToRun.DisplayMember = "BatchNo"; 

     this.tbBatchCode.Text = this.repo.GetBatchStringValue(((Batch)this.cbBatchesToRun.SelectedValue).BatchNo); 
} 

RetrieveBatchesAsync() ist definiert als:

public async Task<List<Batch>> RetrieveBatchesAsync() { 
    var batches = await (from b in this._context.Batches 
         orderby b.BatchNo descending 
         select b).ToListAsync(); 
    return batches; 
} 

Aus irgendeinem Grund ist dies immer noch synchron, da das Formular ein paar o dauert f Sekunden zum Öffnen im Vergleich zu anderen Formen, die keine Daten abrufen.

Was fehlt mir, damit das Formular sofort geöffnet wird und Daten asynchron geladen werden? Im Wesentlichen versuche ich, das Formular sofort mit allen Steuerelementen zu öffnen und die Steuerdaten danach zu füllen und das Label "Loading" zu verbergen, das ich in das WinForm platziert habe.

Edit: Hinzugefügt dem Abrufen Batches Async Methode

+0

Sind Sie sicher, dass 'RetrieveBatchesAsync()' tatsächlich asynchron ist und nicht nur vorgibt asynchron zu sein? – svick

+0

@svick hat die Methodendefinition in die Frage eingefügt. Ich glaube, dass es async sein sollte, wie ich EF verwende, um das zu erhalten. –

+0

Wird der UI-Thread tatsächlich blockiert, d. H. Reagiert die Anwendung nicht mehr? Wenn ja, können Sie den Debugger anhalten, während er blockiert ist, und den Stack-Trace des UI-Threads posten? – svick

Antwort

0

Alles ist gut.

Es stellt sich die awaitable aus funktionierte perfekt, wie ich es getestet, indem ein

await Task.Delay(10000); 

im LoadDataAsync() -Methode hinzugefügt wird.

Es ist einfach passiert, dass das Formular im Vergleich zu anderen Formen aufgrund der Menge der Kontrollen, die ich in meiner Form habe, langsamer geladen wurde. (Ich glaube).

Danke für die Breakpoint-Ideen.

Verwandte Themen