Task.Factory.FromAsync是否会触发创建的任务?

Ahm*_*gle 2 c# async-await

我有两个任务,t1并且t2,我从一个旧的API,它产生开始/结束异步模型如下.不过,我严格要运行它们一个接一个.(这是Azure Table存储API)

Task<DataServiceResponse> t1 = Task.Factory.FromAsync(ctx1.BeginSaveChangesWithRetries(null, null), r => ctx1.EndSaveChangesWithRetries(r));
Task<DataServiceResponse> t2 = Task.Factory.FromAsync(ctx2.BeginSaveChangesWithRetries(null, null),  r => ctx2.EndSaveChangesWithRetries(r));

await t1.ContinueWith(t => t2, TaskContinuationOptions.NotOnFaulted | TaskContinuationOptions.NotOnCanceled);
Run Code Online (Sandbox Code Playgroud)

我阅读了FromAsync文档,但没有声明这些任务(t1&t2)被触发:

FromAsync(IAsyncResult, Action<IAsyncResult>): 创建一个Task,在指定的IAsyncResult完成时执行end方法操作.

  • 成功执行后,此保证t2是否始终执行?t1
  • 我相信这段代码调用Begin...了开始/结束对的方法.通常是在end方法中完成的操作(在这种情况下,向Azure Service发出HTTP请求)?(我不太熟悉开始/结束实现内部的内容)
  • 是否t1开始(或者是预定)之前await声明(像我使用Task.Factory.StartNew)?

Raf*_*fal 6

更明确的不仅仅是"不,它不会做你想要的"作为答案:

Task.Factory.FromAsync是否会触发创建的任务?

是的,该Task对象是完全正常的,并将执行它的设计目的 - 等待已经运行的请求结束.

这是否保证t2在成功执行t1后始终执行?

没有网络请求已经在运行/退出我们的控制权以进行deffer/order.

创建的任务FormAsync无法自行启动.它们IAsyncResult作为参数接收,因此您已通过调用已启动基础作业/任务/ Web请求BeginSaveChangesWithRetries.这里的任务只是这个遗留异步机制的包装器,允许您等待它们并以新的方式编写代码.

要做到这一点,只需写下:

await Task.Factory.FromAsync(ctx1.BeginSaveChangesWithRetries(null, null), r => ctx1.EndSaveChangesWithRetries(r));
await Task.Factory.FromAsync(ctx2.BeginSaveChangesWithRetries(null, null),  r => ctx2.EndSaveChangesWithRetries(r));
Run Code Online (Sandbox Code Playgroud)

如果第一次等待抛出,那么第二次不会被执行.