简短版本:我想创建一个可以在以后执行的 GENERIC 任务,但我不确定这样做所需的语法。
LONG VERSION:我已经构建了一个自定义的Fluent语法SQL Generator / ORM。它包括同步方法,如......
var dt = DB.Select().From("TABLE_NAME").Where("WHERE CONDITIONS").ToDataTable(connString);
var dr = DB.Select().From("TABLE_NAME").Where("WHERE CONDITIONS").ToDataReader(connString);
返回System.Data.DataTable / DataReader(旧学校,但我还有很多遗留的ADO.NET代码需要处理)。
我现在正在向此生成器引入async / await和Tasks。我想创建像
这样的东西var task1 = DB.Select().From("TABLE_NAME").Where("WHERE CONDITIONS").ToTask<DataTable>(connString);
var task2 = DB.Select().From("TABLE_NAME").Where("WHERE CONDITIONS").ToTask<DataRow>(connString);
var task3 = DB.Select().From("TABLE_NAME").Where("WHERE CONDITIONS").ToTask<DataReader>(connString);
每个任务都会带回潜在的不同的泛型类型。但是我希望延迟执行。我希望可以带回许多任务,然后再做...
await Task.WhenAll(task1, task2, task3, etc...)
我正在努力解决这个问题...到目前为止我的想法......
public Task<T> ToTask<T>(string connStr)
{
Task<T> t = new Task<T>(); //maybe?
//SetResult will block until loaded???
TaskCompletionSource<T> tcs = new TaskCompletionSource<T>();
tcs.SetResult((T) LoadThisGenericType(typeof(T)));
return tcs.Task;
}
我咬的比我嚼得多吗?任何指导都将不胜感激。
UPDATE:以下是ToDataReaderAsync的实现,以供参考......
public async Task<SqlDataReader> ToDataReaderAsync(string connStr)
{
using (SqlConnection con = await DB.SQL.CreateConnectionAsync(connStr))
using (SqlCommand cmd = DB.SQL.CreateCommand(con))
{
cmd.CommandText = "TEXT OF COMMAND HERE"; //Stored proc, INSERT, UPDATE, etc...
return await cmd.ExecuteReaderAsync();
}
}