2016-04-27 19 views
0

我有一個從菜單中打開的窗體的MDI。如何在異步加載數據值時在MDI中顯示錶單?

此表單有一個組合框,將填充從SQL查詢中檢索的值。

此刻,當我嘗試打開表單時,會有幾秒鐘的延遲,因爲表單將觸發查詢以返回值以填充組合框。

有沒有辦法讓表格彈出並在稍後填入值?

我有一個事件處理程序上的負載,用於與以下形式:

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

其中LoadDataAsync()方法將是爲:

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()被定義爲:

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

由於某些原因,這仍然是所有同步的形式需要一對夫婦o與其他不檢索數據的表單相比,打開時間更長。

我缺少什麼讓表單立即打開並使其異步加載數據?實質上,我試圖做的是立即用所有控件打開表單,然後讓它填充控制數據,並隱藏我放入winform的「加載」標籤。

編輯:增加了批量檢索異步方法

+0

你確定'RetrieveBatchesAsync()'實際上是異步的,而不是假裝異步嗎? – svick

+0

@svick將方法定義添加到問題中。我相信它應該是異步的,因爲我使用EF來檢索它。 –

+0

UI線程是否實際阻止,即應用程序是否停止響應?如果是的話,你可以在調試器被阻塞時暫停併發布UI線程的堆棧跟蹤嗎? – svick

回答

0

一切都很好。

原來,awaitable被完美的工作,因爲我通過在LoadDataAsync()方法增加一個

await Task.Delay(10000); 

進行了測試。

剛剛發生的事情是,由於表單中的控件數量多,表單加載速度比其他表單要慢。 (我相信)。

感謝您的斷點點子。

相關問題