我使用的是oneDrive API,也就是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;它将等待特定时间,然后取消请求。
如果没有internet连接:
在情况A中,methodA()将挂起在getAsync上,并且永远不会进行,因此永远不会调用doSomething()方法。
在情况B中,当cancellationToken取消调用时,methodB()将处理异常,然后前进到doSomething()方法。
现在我关心的和我的问题是:我担心保持等待调用挂起将意味着锁定一个线程,并将影响性能,特别是如果用户多次单击按钮来调用methodA()。
我的担忧是合理的吗?有没有办法让.NET运行时知道这个等待的操作超时了??并最终取消它?
发布于 2014-10-23 23:16:31
如果你想传入一个在一段时间后超时的CancellationToken,有一个constructor for CancellationTokenSource可以做到这一点:
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
var meResult = await connectClient.GetAsync("me", cts.Token); 顺便说一句,即使您不这样做,.NET线程也不会在您等待GetAsync完成时被锁定-这是使用await而不是.Result的直接好处之一。
Stephen Toub的相关文章:Coalescing CancellationTokens from Timeouts
https://stackoverflow.com/questions/26531324
复制相似问题