gpt4 book ai didi

c# - Task.Factory.FromAsync 是否触发创建的任务?

转载 作者:行者123 更新时间:2023-11-30 20:01:55 27 4
gpt4 key购买 nike

我有两个任务 t1t2我从使用开始/结束异步模型设计的旧 API 生成,如下所示。然而,我严格想要一个接一个地运行它们。 (这是 Azure 表存储 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);

我读了 FromAsync 文档,但它没有说明这些任务(t1t2)是否被解雇:

FromAsync(IAsyncResult, Action<IAsyncResult>): Creates a Task that executes an end method action when a specified IAsyncResult completes.

  • 这个保证吗t2将始终在成功执行 t1执行?
  • 我相信这段代码调用了Begin...开始/结束对的方法。通常操作(在这种情况下,向 Azure 服务发出 HTTP 请求)是在结束方法中完成的吗? (我不太熟悉开始/结束实现中的内容)
  • 是否t1await 之前开始(或安排)声明(就像我使用 Task.Factory.StartNew )?

最佳答案

比仅仅回答“不,它不会做你想做的”更明确:

Does Task.Factory.FromAsync fire created tasks?

是的,Task 对象具有完整的功能,并将执行其设计目的 - 等待已运行的请求结束。

Does this guarantee t2 will always be executed after successful execution of t1?

没有 Web 请求已经运行/超出您的控制以推迟/订购它们。

FormAsync 创建的任务无法自行启动。它们接收 IAsyncResult 作为参数,因此您已经通过调用 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));

如果第一个 await 抛出则第二个不会被执行。

关于c# - Task.Factory.FromAsync 是否触发创建的任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17803691/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com