首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在等待长任务时保存/保留变量的值

在等待长任务时保存/保留变量的值
EN

Stack Overflow用户
提问于 2021-07-15 20:06:50
回答 1查看 67关注 0票数 1

我有一个ReceiveMessages()方法,它异步接收消息。每条消息都有一个名为executionId的参数。当收到消息时,我将获得executionId,然后执行一个名为RunScript()的可等待的长任务,该任务可能需要20分钟。在RunScript()任务完成之后,我使用消息的executionId将数据写入数据库。但是,当新消息在RunScript()处理完前一条消息之前到达时,executionId会更改,并且我无法使用原始executionId将数据保存在数据库中。

代码如下:

代码语言:javascript
复制
public class Job
{
    private Guid _executionId;

    Private async Task ReceiveMessages(message)
    {
       DirectExecRequestDto deserializedMessage = new DirectExecRequestDto();
       deserializedMessage = JsonConvert.DeserializeObject<DirectExecRequestDto>(message);

       executionId = deserializedMessage.ExecutionId;

       await RunScript(message); //this task can take a long time while messages are being received

       // here executionId is changed to the recently received message
       // I want to use the executionId related to the original message
       SaveResultsInDatabase(ResultsDirectory, executionId); 
    }
}

我该如何解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-15 20:09:47

不要将其存储为对象级字段。只需将其存储在本地声明的变量中即可。

当您使用await在异步函数的上下文中调用异步函数时,将保留本地上下文,因此当异步函数调用返回时,以前在作用域内的局部变量将恢复并可用。

如何在更深层次上做到这一点呢?async函数在编译期间被转换为类。函数中的局部变量被转换为该类上的字段,而await之间的每一段代码都被转换为该类上自己的单独方法。调用异步函数时,将实例化此类的一个实例,并在它们等待的任务完成后的适当时刻调用创建的各种“子函数”。您的局部变量在此实例中保留为字段,可供编译器创建的任何“子函数”使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68393519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档