我有一个ReceiveMessages()方法,它异步接收消息。每条消息都有一个名为executionId的参数。当收到消息时,我将获得executionId,然后执行一个名为RunScript()的可等待的长任务,该任务可能需要20分钟。在RunScript()任务完成之后,我使用消息的executionId将数据写入数据库。但是,当新消息在RunScript()处理完前一条消息之前到达时,executionId会更改,并且我无法使用原始executionId将数据保存在数据库中。
代码如下:
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);
}
}我该如何解决这个问题?
发布于 2021-07-15 20:09:47
不要将其存储为对象级字段。只需将其存储在本地声明的变量中即可。
当您使用await在异步函数的上下文中调用异步函数时,将保留本地上下文,因此当异步函数调用返回时,以前在作用域内的局部变量将恢复并可用。
如何在更深层次上做到这一点呢?async函数在编译期间被转换为类。函数中的局部变量被转换为该类上的字段,而await之间的每一段代码都被转换为该类上自己的单独方法。调用异步函数时,将实例化此类的一个实例,并在它们等待的任务完成后的适当时刻调用创建的各种“子函数”。您的局部变量在此实例中保留为字段,可供编译器创建的任何“子函数”使用。
https://stackoverflow.com/questions/68393519
复制相似问题