Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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_Rust - Fatal编程技术网

Asynchronous 如何中断等待';成圈

Asynchronous 如何中断等待';成圈,asynchronous,rust,Asynchronous,Rust,考虑此函数从UDP套接字接收数据报: async fn recv_multiple(socket: &async_std::net::UdpSocket) -> Vec<String> { let mut buf = [0; 1024]; let mut v = vec![]; while let Ok((amt, _src)) = socket.recv_from(&mut buf).await { v.push(St

考虑此函数从UDP套接字接收数据报:

async fn recv_multiple(socket: &async_std::net::UdpSocket) -> Vec<String> {
    let mut buf = [0; 1024];
    let mut v = vec![];

    while let Ok((amt, _src)) = socket.recv_from(&mut buf).await {
        v.push(String::from_utf8_lossy(&buf[..amt]).to_string());
    }

    v
}
如何添加超时功能,以便在恰好1分钟后从多个接收返回一个
Vec
(空或不空)?我需要收集一分钟传入的数据报,然后返回在此期间捕获的内容。请注意,我不需要对来自操作的单个recv_超时,因为数据报可能经常出现,并且函数永远不会超时

我找到了一些局部解决方案,但它们不太合适:

  • 超时一个
    Future
    但部分填充的
    Vec
    被丢弃,只返回
    Err
  • 同样,部分输出被丢弃

  • 在我看来,我应该在这个函数和
    中传递某种类型的“timeout”
    Future
    ,而让
    在套接字和“timeout”
    Future
    上等待。然后,如果套接字触发,我们继续,但如果“timeout”触发,我们将从函数返回。但是我不知道如何做到这一点。

    你可以在
    recv\u multiple
    内部
    recv\u中使用
    socket.recv\u,而不是在
    recv\u multiple
    上计时。每次迭代后都需要重新计算剩余时间。当剩余时间为0时,您可以返回您的
    Vec

    let fut = recv_multiple(&socket);
    async_std::task::block_on(fut);