考虑一个 MVC4 / NET 4.5 异步操作方法,它有两个 IO 绑定的按顺序操作要做,这两个操作都遵循 IAsyncResult 模式。下面我使用 System.DirectoryServices.Protocols 命名空间创建了一个简单的示例。尽管我长期以来一直是 .NET 中的 TPL 和其他异步模型(以及像 node.js 之类的大量回调模型)的粉丝,但我终于开始使用异步/等待。
如 'await' 所示,它返回正确的结果,但我对使用 .ContinueWith 和 Task.Factory.FromAsync 获得相同结果的方法感到困惑,后者有效地减轻了处理混乱的代码IAsyncResult 或回调的语法混乱。
也许我的示例代码已经以最优化的方式做事了?.ContinueWith 似乎是更惯用的方法(或者是吗?),但我找不到任何方法将新任务链接为延续;一个 Func 延续不会在没有转移的情况下在这里切断它。
public async Task<ActionResult> AjaxStuff()
{
var c = new LdapConnection(string.Empty);
var t1 = Task.Factory.FromAsync<string>(
c.BeginSendRequest(new SearchRequest(string.Empty, "(&(objectClass=*))", SearchScope.Base, "defaultNamingContext"), PartialResultProcessing.NoPartialResultSupport, null, null),
iar =>
{
return ((SearchResponse)c.EndSendRequest(iar)).Entries[0].Attributes["defaultNamingContext"][0].ToString();
});
var nc = await t1;
var t2 = Task.Factory.FromAsync<string>(
c.BeginSendRequest(new SearchRequest(nc, "(&(givenName=steve))", SearchScope.Subtree), PartialResultProcessing.NoPartialResultSupport, null, null),
iar =>
{
var result = (SearchResponse)c.EndSendRequest(iar);
return result.Entries.Count > 0 ? result.Entries[0].DistinguishedName : "no such thing";
});
return this.PartialView("AjaxStuff", await t2);
}