我有以下几行代码,用于检查设备是否使用异步方法在数据库中注册。
if (CrossConnectivity.Current.IsConnected)
{
return await App._deviceService.GetDevice(id);
}
我原以为await会做到这一点 - 等待GetDevice完成然后返回它的值,但是在调查时我认为如果我想得到调用的实际结果我需要使用回调,所以我可以采取行动。
有人可以告诉我,如果我要沿着这条路走下去吗?下面是被称为异步任务的
public async Task<bool> GetDevice(string deviceID)
{
string url = Resources.Urls.dev + Resources.DeviceApi.Get + "?id=" + deviceID;
HttpResponseMessage result;
result = await App.HttpClientInstance().GetAsync(url);
if (result.StatusCode == System.Net.HttpStatusCode.OK)
{
return true;
}
return false;
}
答案 0 :(得分:4)
不,实际上使用await
来调用这样定义的方法(Task<bool>
)意味着调用者将等待&#34;等等。要使返回值准备就绪,您的return
将根据true
调用的结果返回false
或GetDevice
。
更新:我在澄清代码实际上并没有主动等待来完成该方法,因为这会破坏async/await
组合的目的,但我的意思是return
语句只有在方法实际完成后才会执行。当HttpClient
请求运行时,调用线程可以在此期间自由执行其他任务,这是使用async/await
的真正优势。
答案 1 :(得分:1)
return await App._deviceService.GetDevice(id);
这将返回任何GetDevice
返回(true
或false
)。您无需进一步操作,因为await
已完成Task
。
一个小建议是将GetDevice
返回更改为
return result.IsSuccessStatusCode;
这样您就不会直接依赖200
而是依赖2xx
(任何成功代码)。