我正在使用oneDrive API aka Live SDK。使用c#和XAML,你可以使用上面提到的方法发出http GET请求,如下所示:
案例A:
public async void methodA()
{
try
{
var meResult = await connectClient.GetAsync("me");
}
catch(Exception ex)
{
//exception handling
}
doSomething();
}
案例B:
public async void methodB()
{
try
{
var meResult = await connectClient.GetAsync("me", token);
}
catch(Exception ex)
{
//exception handling
}
doSomething();
}
其中token
是cancellationToken;等待特定时间然后取消请求。
如果没有互联网连接:
如果A methodA()
将挂起在getAsync上并且永远不会进展,那么永远不会调用doSomething()
方法。
在案例B中,methodB()
将在cancelToken取消呼叫时处理异常,然后进入doSomething()
方法。
现在我关心的问题是:
我担心将等待呼叫挂在那里将意味着锁定一个线程并将影响性能,尤其是当用户多次单击该按钮以调用methodA()
时。
我的担忧是否合理? 有没有办法让.NET运行时知道这个等待的操作超时?并最终取消它?
答案 0 :(得分:1)
如果您希望在一段时间之后传递CancellationToken
超时,那么constructor for CancellationTokenSource
可以做到这一点:
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
var meResult = await connectClient.GetAsync("me", cts.Token);
顺便说一下,即使你不这样做,在等待GetAsync
完成时,.NET线程也不会被锁定 - 这是直接的使用await
代替.Result
的好处。
Stephen Toub的相关文章:Coalescing CancellationTokens from Timeouts