2012-03-02 82 views
3

我們有一個使用Dapper進行數據庫讀取的winforms應用程序。取消長時間運行的Dapper查詢

在一種形式中,我們在後臺線程上有一個(可能的)長時間運行的查詢。

用戶希望能夠取消查詢,所以我需要訪問DbCommand Dapper創建並在其上從另一個線程調用Cancel(如果它正在運行)。

從Dapper公佈DbCommand的最佳方式是什麼?

+0

當前不暴露出來,我想不出它添加任何*易*方式的短傳在通告的接口,一個事件...我假設這個特殊的例子是例外而不是規範?也許代碼*只是這個*手動? – 2012-03-02 10:45:09

+0

我以爲我終於擺脫了手動datareader的東西...不要猜測。但是,我仍然喜歡Dapper。 – Rik 2012-03-02 11:15:13

+0

如果你對此有特別的想法,我都是耳朵......但是......我看不到任何* easy * way = – 2012-03-02 11:25:36

回答

0

這是錘子時間。弄壞東西。

using (var reader = connection.ExecuteReader(query)) { 

....現在取消

var wrappedReaderType = typeof (Dapper.CommandDefinition) 
         .Assembly.GetType("Dapper.WrappedReader"); 
var field = wrappedReaderType 
      .GetField("cmd", BindingFlags.NonPublic | BindingFlags.Instance); 
if (field != null) 
{ 
    var command = field.GetValue(reader) as IDbCommand; 
    if (command != null) 
    { 
     command.Cancel(); 
    } 
}