C#在不启动的情况下创建通用任务

时间:2016-12-28 06:33:41

标签: generics asynchronous async-await expression-trees fluent

简短版本:我想创建一个可以在以后执行的 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();
        }
}

0 个答案:

没有答案