我对异步编程有点新意,所以不要理解很多东西。拜托,我需要更多的帮助。我按照我在其他问题中的建议做了。
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.Delay
与Func<Task<TResponse>>
一起使用(或者可能是某种东西而不是它)?我无法弄清楚如何将Func转换为任务。
2)如果permorms再次请求,似乎返回await sendAsync()
。这不是很好。如果不知怎的话,我可以在Func<Task<..>>
里面得到结果吗?
答案 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>