常规迭代器块(即"yield return")是否与"async"和"await"不兼容?
这样可以很好地了解我正在尝试做的事情:
async Task<IEnumerable<Foo>> Method(String [] Strs)
{
// I want to compose the single result to the final result, so I use the SelectMany
var finalResult = UrlStrings.SelectMany(link => //i have an Urlstring Collection
await UrlString.DownLoadHtmlAsync() //download single result; DownLoadHtmlAsync method will Download the url's html code
);
return finalResult;
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到编译器错误,引用"无法从资源加载消息字符串".
这是另一种尝试:
async Task<IEnumerable<Foo>> Method(String [] Strs)
{
foreach(var str in strs)
{
yield return await DoSomethingAsync( str)
}
}
Run Code Online (Sandbox Code Playgroud)
但同样,编译器返回错误:"无法从资源加载消息字符串".
这是我项目中真正的编程代码
当我有一个List Task时,这非常有用,该任务可以从URL下载HTML,我使用语法"yield return await task",结果是我想要的 …
我的目标很简单,我想做异步I/O调用(使用异步等待) - 但是:
好.
目前这里是我的代码,它的工作是从db读取并将每一行项目投射到a 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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
那么,投影机是什么?
每个类都有一个函数,它获取a record(IDataRecord)并创建一个实体:
示例:
public class MyClass
{
public static MyClass MyClassFactory(IDataRecord …Run Code Online (Sandbox Code Playgroud) 我有以下方法:
public async IEnumerable<string> GetListDriversAsync()
{
var drives = await graphClient.Drive.Root.Children.Request().GetAsync();
foreach (var d in drives)
yield return d.ToString();
}
Run Code Online (Sandbox Code Playgroud)
但是编译器错误说:
“async 的返回类型必须是 void、Task 或 Task
<T>”
当方法为异步时如何返回 IEnumerable?