2015-05-26 56 views
0

我正在嘗試填充數據集,但我想限制系統必須將此數據集填充到30秒的時間量。限制一個例程可以運行的時間 - VBNET

我曾嘗試(如在別處SO建議):

Dim T As Date = Date.Now 
da.Fill(ds, "DATASET") 
Do 

    If (Date.Now - T).TotalSeconds >= 30 Then 
     Main.VIEW_Title.Text = "Error In Connection..." 
     Exit Sub 
    End If 
    Exit Do 
Loop 

但該系統只是da.Fill(ds, "DATASET")節期間掛起反正,不永遠exectute的「錯誤連接」的消息。如果我將線放入DO也沒關係,因爲它停在那裏。我需要的是執行fill命令,然後如果它在30秒內沒有完成,讓我來處理這個錯誤。

感謝

+0

設置連接字符串的超時時間,然後處理異常。 – Alejandro

+1

哦,男孩,這裏有很多錯誤。首先,你立即用'Exit Do'退出Do循環,所以難怪這個消息不會出現。其次,'da.Fill'是可阻塞的阻塞調用,意味着它需要在代碼執行繼續之前完成。一般情況下,您需要在另一個線程中使用異步方法,該方法可以進行插入,這並不總是微不足道的。 – Jens

+0

@Jens - 這很有道理,但是我沒有真正做過任何與Async調用有關的東西......是否有可能提供一個例子,我也會做一些研究。謝謝 – SilverShotBee

回答

0

不幸的是,這不是那麼容易了。

可以要做的是:

  • 啓動一個後臺線程並在該線程做填充操作。
  • 在主線程中,等待100ms,檢查新線程是否完成,重複最多300次。

現在真正的問題是:你會怎麼做,如果主線程確定後臺線程具有 30秒後完成了嗎? DataAdapter.Fill沒有提供正常中斷操作的方法,因此您必須讓它在後臺繼續。

這也意味着您必須在後臺線程中使用單獨的數據連接,因爲ADO.NET類不是線程安全的。


我寧願提出一個不同的做法:取超過30秒的數據選擇操作意味着之一:

  • 您選擇太多的數據(有真正顯示一個百萬行沒有使用用戶)或
  • 您的查詢需要優化(如放置良好的索引)。

因此,我建議修復根本原因,而不是使用複雜的解決方法來掩蓋症狀。

相關問題