[英]Oracle Client vs. Task-based Asynchronous Pattern (async/await)
我想編寫一堆以異步/等待方式查詢Oracle數據庫的方法。 由於ODP.NET似乎既不支持等待的* Async方法也不支持Begin / EndOperationName對,因此我必須手動執行哪些選項?
到目前為止,我已經看到了所有I / O密集型異步方法的示例,它們僅調用.NET庫中的其他異步方法,但是在內部進行上下文切換的方式上絲毫不為過。 該文檔說,在這些情況下,不使用單獨的線程,並且多線程開銷顯然僅對CPU密集型操作有價值。 所以我想使用Task.Run()不是一個選擇,否則我錯了嗎?
只要我知道Oracle ODP是異步庫的同步包裝器即可。 我發現這個帖子的時候,我只是想知道一個問題:為Oracle ODP調用引入異步模式是否會提高性能? (我在IIS NET TCP上使用WCF)。
但是,正如已經說過的,只要完成了異步模式的創建,就創建了一個新Task,並且調用線程已經在線程池中,就無法進行任何改進,這只是開銷。
您始終可以將Task.Factory.StartNew與TaskCreationOptions.LongRunning一起使用,以便.NET將創建一個新線程,而不是使用線程池線程。 以下是可應用於您的操作的手動異步代碼。
private static void ManualAsyncOperation()
{
Task<string> task = Task.Factory.StartNew(() =>
{
Console.WriteLine("Accessing database .....");
//Mimic the DB operation
Thread.Sleep(1000);
return "Hello wolrd";
},TaskCreationOptions.LongRunning);
var awaiter =task.GetAwaiter();
awaiter.OnCompleted(() =>
{
try
{
var result = awaiter.GetResult();
Console.WriteLine("Result: {0}", result);
}
catch (Exception exception)
{
Console.WriteLine("Exception: {0}",exception);
}
});
Console.WriteLine("Continuing on the main thread and waiting for the result ....");
Console.WriteLine();
Console.ReadLine();
}
我正在用這個
public static class TaskHelper
{
public async static Task<T> AsAsync<T>(Func<T> function, TaskCreationOptions taskCreationOptions = TaskCreationOptions.None)
{
return await Task.Factory.StartNew(function, taskCreationOptions);
}
public async static Task AsAsync(Action action, TaskCreationOptions taskCreationOptions = TaskCreationOptions.None)
{
await Task.Factory.StartNew(action, taskCreationOptions);
}
}
任何同步功能都可以設為異步,您可以等待它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.