2017-04-05 104 views
0

我試圖讓我的代碼能夠在同一時間運行多個查詢,但作爲實施devart還沒有等待/異步,我有一些問題搞清楚如何使其正常工作是否有可能換Devart Oracle驅動程序,使之異步

我的第一個想法是剛剛換我的倉庫電話與

public Task SleepAsync(int millisecondsTimeout) 
{ 
    return Task.Run(() => Sleep(millisecondsTimeout)); 
} 

但從https://blogs.msdn.microsoft.com/pfxteam/2012/03/24/should-i-expose-asynchronous-wrappers-for-synchronous-methods/這聽起來像一個壞主意,真的不一事無成

所以我一直在尋找異步功能Devart在司機 https://www.devart.com/dotconnect/oracle/articles/asynchronous.html

的問題是,我無法弄清楚如何使用這個BeginExecuteReader和EndExecuteReader用短小精悍,我結束了類似

await Task.Factory.FromAsync(sqlConnection.BeginOpen, sqlConnection.EndOpen, null); 
var oracleCommand = new OracleCommand(sql, sqlConnection); 

OracleDataReader result = await Task.Factory.FromAsync(oracleCommand.BeginExecuteReader, oracleCommand.EndExecuteReader, null); 

所以我最終OracleDataReader而正常情況下我想用結束了的IEnumerable:

IEnumerable<TModel> elements = await sqlConnection.QueryAsync<TModel>(sql, parameters); 

我已經第一次嘗試是使用只寫它小巧玲瓏

保護異步任務GetElement(字符串SQL,對象參數= NULL)

{ 
    using (var sqlConnection = new OracleConnection(Connectionstring)) 
    { 
     await sqlConnection.OpenAsync(); 
     var element = await sqlConnection.QuerySingleAsync<TModel>(sql, parameters); 

     return element; 
    } 
} 

但是,這並不異步

運行是否可以繼續使用小巧精緻,並使它真正異步?

+0

我不使用Dapper,但是我發現這個[github頁面](https://github.com/StackExchange/ Dapper/blob/master/Dapper/SqlMapper.Async.cs),它概述了.NET 4.5的異步調用。這有幫助嗎? – tbone

+0

**但是那不會運行異步**,你怎麼知道你的代碼沒有運行異步,因爲我看到兩個'await'語句,無論如何,它們依次運行,即使你的調用線程被切回到調用者,由於'await' –

回答

0

有情侶在這裏混了點,讓我嘗試通過一個澄清他們一個。

我試圖讓我的代碼能夠在同一時間運行多個查詢,但作爲實施devart還沒有等待/異步,我有一些問題搞清楚如何使其正常工作

你怎麼知道他們還沒有實現Async/Await,因爲他們已經實現了IDbConnection界面,您可以用小巧玲瓏用於撥打異步調用,那麼大多是這是一個猜測,在您的其他問題Dapper not running Async together with Devart oracle driver之一,我已經回覆了一段代碼片段。在這旁邊,Devart已經實施BeginXXEndXX,(APM模式),這對於Async-Await的前身,被稱爲Asynchronous Programming Model,這應有助於實現一個詳細的方式相同的功能。

我的第一個想法是剛剛換我的倉庫電話與

這種想法簡直是糟糕的異步的目的是通過調用線程池線程異步運行的方法擊敗,從而線程池線程仍在等待,這不是真正的異步調用,它被分派到像數據庫的遠程過程所需。此外它不是即使在這裏需要的,因爲你有異步API的使用,APM和異步等待

的問題是,我無法弄清楚如何使用這個BeginExecuteReader和EndExecuteReader用短小精悍,我結束了類似

原因是這些電話甚至不會與Dapper一起使用,這些是電話,如果您使用Devart直接撥打電話,Dapper不會爲您提供與DataReader和其他ADO.Net直接對象,因爲它在內部與它們一起工作。

Code Snippet是完全正常的,如果你想對異步API和事實上完全控制DataReader可用於內部產生IEnumerable<T>自定義代碼,查Best method to use IDataReader as IEnumerable<T>?

OracleDataReader result = await Task.Factory.FromAsync(oracleCommand.BeginExecuteReader, oracleCommand.EndExecuteReader, null);

最後一部分涉及到Async代碼運行是Sync模式似乎只是假設,直到並且除非您已驗證,Devart中的異步方法實現,並且它們在內部將該調用重定向到Sync函數,大多數情況下它們將使用Task.Factory.FromAsync來調用其APM方法或將實施真正的異步方法使用TaskCompletionSource<T>,這是創建異步版本的標準機制

+0

請驗證Devart實現的異步調用,而不是做出假設 –

相關問題