获得Func <task <iresponse>&gt;的结果内部超时检查

时间:2017-11-08 14:42:07

标签: c# asynchronous

我对异步编程有点新意,所以不要理解很多东西。拜托,我需要更多的帮助。我按照我在其他问题中的建议做了。

public async Task<TResponse> SendRequestAsync<TResponse>(Func<Task<TResponse>> sendAsync)
{
        int timeout = 15;
        if (await Task.WhenAny(sendAsync, Task.Delay(timeout) == sendAsync))
        {
            return await sendAsync();
        }
        else
        {
            throw new Exception("time out!!!");
        }
}

但是我需要获得sendAsync()的结果并将其返回。我也有问题:

1)最好的方法是什么以及如何将Task.DelayFunc<Task<TResponse>>一起使用(或者可能是某种东西而不是它)?我无法弄清楚如何将Func转换为任务。

2)如果permorms再次请求,似乎返回await sendAsync()。这不是很好。如果不知怎的话,我可以在Func<Task<..>>里面得到结果吗?

2 个答案:

答案 0 :(得分:1)

请求被发送两次,因为sendAsync是一个Func返回任务,每次调用都不同。您先在Task.WhenAny()下调用它,然后在运算符return await sendAsync()中重复。

要避免这种重复的调用,您应该将任务保存到变量并将该任务传递给两个调用:

public async Task<TResponse> SendRequestAsync<TResponse>(Func<Task<TResponse>> sendAsync)
{
    int timeout = 15;
    var task = sendAsync();
    if (await Task.WhenAny(task, Task.Delay(timeout) == task))
    {
        return await task;
    }
    else
    {
        throw new Exception("time out!!!");
    }
}
完成任务的

await将返回其结果而不重新运行任务。

答案 1 :(得分:1)

由于你是异步编程的新手 - 最好不要在一个语句中放入太多东西,最好将它分开:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" name="1" id="1" onchange="some_function(this)"/><br>
<input type="text" name="2" id="2" onchange="some_function(this)"/><br>
<select name="3" id="3" onchange="some_function(this)">
    <option>A</option>
    <option>B</option>
</select>
<br>
<select name="4" id="4" onchange="some_function(this)">
    <option>X</option>
    <option>Y</option>
</select>