首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getAsync("Text") vs getAsync("text",cancellationToken)

getAsync("Text") vs getAsync("text",cancellationToken)
EN

Stack Overflow用户
提问于 2014-10-23 23:11:37
回答 1查看 381关注 0票数 0

我使用的是oneDrive API,也就是Live SDK。使用c#和XAML,您可以使用上述方法发出http GET请求,如下所示:

案例A:

代码语言:javascript
复制
public async void methodA()
{

    try
    {
       var meResult = await connectClient.GetAsync("me"); 
    }
     catch(Exception ex)
    {
    //exception handling
    }

    doSomething();
  } 

案例B:

代码语言:javascript
复制
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运行时知道这个等待的操作超时了??并最终取消它?

EN

回答 1

Stack Overflow用户

发布于 2014-10-23 23:16:31

如果你想传入一个在一段时间后超时的CancellationToken,有一个constructor for CancellationTokenSource可以做到这一点:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26531324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档