我有两个任务,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是否始终执行?t1Begin...了开始/结束对的方法.通常是在end方法中完成的操作(在这种情况下,向Azure Service发出HTTP请求)?(我不太熟悉开始/结束实现内部的内容)t1开始(或者是预定)之前await声明(像我使用Task.Factory.StartNew)?更明确的不仅仅是"不,它不会做你想要的"作为答案:
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)
如果第一次等待抛出,那么第二次不会被执行.
| 归档时间: |
|
| 查看次数: |
511 次 |
| 最近记录: |