Generics C#创建一般任务而不启动它

Generics C#创建一般任务而不启动它,generics,asynchronous,async-await,expression-trees,fluent,Generics,Asynchronous,Async Await,Expression Trees,Fluent,简短版本:我想创建一个可以稍后执行的通用任务,但我不确定这样做所需的语法 长版本:我构建了一个自定义的流畅语法SQL生成器/ORM。它包括同步方法,如 var dt = DB.Select().From("TABLE_NAME").Where("WHERE CONDITIONS").ToDataTable(connString); var dr = DB.Select().From("TABLE_NAME").Where("WHERE CONDITIONS").ToDataReader(conn

简短版本:我想创建一个可以稍后执行的通用任务,但我不确定这样做所需的语法

长版本:我构建了一个自定义的流畅语法SQL生成器/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/Wait和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);
我正在努力编写代码……这是我到目前为止的想法……

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;
}
公共任务ToTask(字符串connStr)
{
Task t=新任务();//可能吗?
//SetResult将阻止,直到加载???
TaskCompletionSource tcs=新的TaskCompletionSource();
SetResult((T)加载此GenericType(typeof(T));
返回tcs.Task;
}
我是不是咬得太多了??任何指导都将不胜感激

更新:以下是我对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();
        }
}
公共异步任务ToDataReaderAsync(字符串connStr) { 使用(SqlConnection con=await DB.SQL.CreateConnectionAsync(connStr)) 使用(SqlCommand cmd=DB.SQL.CreateCommand(con)) { cmd.CommandText=“此处的命令文本”;//存储的过程、插入、更新等。。。 返回wait cmd.ExecuteReaderAsync(); } }
您可以使用某些类型的同步对象(类似于互斥或信号量),创建的任务将等待这些对象,直到主线程通知这些对象。发布一个同步实现示例(例如,
ToDataReader
),然后应该清楚如何创建异步等效对象(例如,
ToDataReaderAsync
)@StephenCleary我已经更新了帖子,加入了我的ToDataReaderAsync实现。这一部分很简单。我搞不清楚的是通用ToTask实现。我搞不清楚你试图用通用的
ToTask
实现做什么。它提供了什么价值?@StephenCleary我真的希望延迟并行执行。我不想返回DataReader,而是想返回一个稍后将要执行的任务。或者一个任务,或者一个任务,等等。我看到了很多任务。当所有的示例都出现时,我正试图定位我的代码以利用这一点(但以一种通用的方式)。
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();
        }
}