Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 在实现异步定时器时如何处理生存期? 背景_Asynchronous_Timer_Rust_Async Await - Fatal编程技术网

Asynchronous 在实现异步定时器时如何处理生存期? 背景

Asynchronous 在实现异步定时器时如何处理生存期? 背景,asynchronous,timer,rust,async-await,Asynchronous,Timer,Rust,Async Await,我正在Rust中通过http连接开发一个数据库管理器。数据库有一个身份验证过期策略,我需要在过期后通过重新登录在数据库管理器中保持连接 伪码 我的数据库管理器是数据库,它有一些方法: 结构数据库{ 访问令牌:选项 } impl数据库{ 异步fn登录(&mut self,auth:Option){ 如果让一些(auth)=auth{ //如果用户提供auth,请使用auth登录 让响应=登录(auth)。等待; //从响应获取访问令牌 self.access\u token=Some(respon

我正在Rust中通过http连接开发一个数据库管理器。数据库有一个身份验证过期策略,我需要在过期后通过重新登录在数据库管理器中保持连接

伪码 我的数据库管理器是
数据库
,它有一些方法:

结构数据库{ 访问令牌:选项 } impl数据库{ 异步fn登录(&mut self,auth:Option){ 如果让一些(auth)=auth{ //如果用户提供auth,请使用auth登录 让响应=登录(auth)。等待; //从响应获取访问令牌 self.access\u token=Some(response.access\u token); }否则{ //如果用户未提供身份验证,请使用access\u令牌登录 do_登录(访问令牌)。等待; } 重新启动计时器(); } //重新启动登录计时器 fn重新启动\u计时器(&mut self){ self.cancel_timer(); self.do_启动计时器(); } } 我的实现 我使用tokio来实现
重启计时器
功能:

  • 首先,我将一个字段
    timer:Option
    添加到
    数据库
  • 然后,当调用
    do\u start\u timer()
    时,使用
    tokio::spawn
    生成一个新任务,并将返回的连接句柄分配给
    self.timer
  • tokio::spawn
    闭包中,我等待
    tokio::time::delay\u进行
    ,然后等待
    登录
  • 要取消计时器,我只需将
    self.timer
    分配给
    None
    ,使任务分离
问题 在上述实现的详细代码中,有一个触动人心的东西:

self.timer=Some(东京::产卵(异步移动{
东京:时间:延迟(/*…*/)。等待;
self.login().wait;
}));
上面的代码段位于
do\u start\u timer
中,但无法编译:

expected `&mut Database`
found `&mut Database`
but, the lifetime must be valid for the static
我不知道该怎么办