我的目标很简单,我想做异步 I/O 调用(使用 async wait) - 但是:
- 不使用 DataFlow 依赖项(就像这个答案一样 https://stackoverflow.com/a/13148683/859154)
- 没有中间缓冲区(不喜欢这个答案 https://stackoverflow.com/a/13148683/859154)
- Projector 函数应作为参数发送。 (不喜欢这个答案 https://stackoverflow.com/a/13149492/859154)
Ok.
目前这是我的代码,它的工作是从数据库读取并将每一行投影到Func<>
public IEnumerable < T > GetSomeData < T > (string sql, Func < IDataRecord, T > projector)
{
using(SqlConnection _conn = new SqlConnection(@"Data Source=..."))
{
using(SqlCommand _cmd = new SqlCommand(sql, _conn))
{
_conn.Open();
_cmd.CommandTimeout = 100000;
using(IDataReader rdr = _cmd.ExecuteReader())
{
while (rdr.Read()) yield return projector(rdr);
}
}
}
}
那么,什么是投影仪?
每个类都有一个函数,它得到一个record
( IDataRecord
)并创建一个实体:
例子 :
public class MyClass
{
public static MyClass MyClassFactory(IDataRecord record)
{
return new MyClass
{
Name = record["Name"].ToString(),
Datee = DateTime.Parse(record["Datee"].ToString()),
val = decimal.Parse(record["val"].ToString())
};
}
public string Name { get; set; }
public DateTime Datee { get; set; }
public decimal val { get; set; }
}
所以在这里 ,MyClassFactory
将是Func
那么我目前如何运行它呢?
var sql = @"SELECT TOP 1000 [NAME],[datee] ,[val] FROM [WebERP].[dbo].[t]";
var a = GetSomeData < MyClass > (sql, MyClass.MyClassFactory).Where(...); //notice the Func
All ok.
问题现在开始:
Adding async
该方法会产生错误:( 是的,我知道 Ienumerable 是一个同步接口因此出现问题)
public async Task<IEnumerable < T >> GetSomeData < T > (string sql, Func < IDataRecord, T > projector)
不能是迭代器块,因为
'系统.线程.任务.任务>'
不是迭代器接口类型
但这里的这个人却做到了 https://stackoverflow.com/a/13149492/859154 - :
Which DOES编译。
Question
我怎样才能转换my code支持完全异步IO调用?
(在条件下:没有数据流依赖,发送投影仪函数作为参数,没有中间缓冲区)