我想写一堆的查询在异步/ AWAIT方式Oracle数据库的方法。 由于ODP.NET似乎既不支持awaitable *异步方法,也开始/ EndOperationName对,有什么可以怎么做手工实现这一点?
为I / O密集型异步方法,我见过的所有例子到目前为止调用从.NET库中唯一的其他异步方法,但没有光线洒在上下文切换在内部做的方式。 该文件说,在这些情况下,没有单独的线程中使用和多线程的开销仅适用于CPU密集型操作显然是值得的。 所以我想用Task.Run()是不是一种选择,还是我错了?
只要我知道甲骨文ODP是异步库同步包装。 我发现这个职位,我只是想知道的一样:引进的Oracle ODP调用异步模式将提高性能? (我使用IIS NET TCP WCF)。
但是,因为它已经表示,只要引进了异步模式完成创建新任务,并且调用线程已经从线程池,没有改善无法做到的,这将只是一个开销。
你可以随时使用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);
}
}
任何同步功能可以由异步的,你可以等待它。
文章来源: Oracle Client vs. Task-based Asynchronous Pattern (async/await)