【发布时间】: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