【问题标题】:getAsync("Text") vs getAsync("text", cancellationToken)getAsync(“文本”)与 getAsync(“文本”,cancellationToken)
【发布时间】:2014-10-23 23:25:09
【问题描述】:

我正在使用 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;这将等待特定时间然后取消请求。

如果没有互联网连接:

在情况 A 中,methodA() 将挂在 getAsync 上并且永远不会进行,因此永远不会调用 doSomething() 方法。

在情况 B 中,methodB() 将在cancellationToken 取消调用时处理异常,然后转到doSomething() 方法。

现在我关心的问题是: 恐怕保持等待调用挂在那里意味着锁定一个线程并会影响性能,特别是如果用户多次单击按钮调用methodA()

我的担心是否合理? .NET 运行时是否有办法知道这个等待的操作已超时?并最终取消它?

【问题讨论】:

  • 你不应该在这里使用async void 方法。
  • 你能详细说明原因吗?
  • 因为它禁止调用者知道方法何时完成,以及是否成功。
  • 很好的提示,谢谢

标签: c# asynchronous task-parallel-library


【解决方案1】:

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

var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
var meResult = await connectClient.GetAsync("me", cts.Token); 

顺便说一句,即使您不这样做,在您等待 GetAsync 完成时,.NET 线程也不会被锁定 - 这是使用 await 而不是 @987654328 的直接好处之一@。

Stephen Toub 的相关文章:Coalescing CancellationTokens from Timeouts

【讨论】:

  • 可能是我没有正确表达自己。我担心的是 methodA 会被调用很多次,每次它都挂在 await 线上。我知道我可以通过cancellationToken解决它,但我的问题是:如果我使用第一种方法并且多次请求的方法没有连接,会导致线程池耗尽吗?性能惩罚?提前谢谢
  • @stackunderflow 从提供的信息看,我看不出来。
  • 请建议我编辑我的问题,以便可以回答!
  • @stackunderflow 尝试在您的问题中提供更多上下文。问题是我现在不明白你在问什么,所以我真的无法建议如何更好地问它。
  • @stackunderflow 是的,没错。任何无限期悬挂的东西都是不好的。如果您正在访问的服务有可能不可用,您绝对应该使用CancellationToken 方法 - 这就是它的部分用途!
猜你喜欢
  • 1970-01-01
  • 2017-07-25
  • 2023-03-19
  • 2016-04-20
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多