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

时间:2014-10-23 15:11:37

标签: c# asynchronous task-parallel-library

我正在使用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运行时知道这个等待的操作超时?并最终取消它?

1 个答案:

答案 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