我使用的是dotMorten提供的一个名为LifxNet的nuget包。我可以改变灯泡的颜色,打开和关闭它。我现在想有一个按钮,可以切换灯泡的功率。我尝试使用GetLightStateAsync()方法来检查灯是开着还是关着的。
private void btnPower_Click(object sender, RoutedEventArgs e)
{
var powerState = client.GetLightStateAsync(selectedLight).Result.IsOn;
if (powerState == false)
{
client.SetDevicePowerStateAsync(selectedLight, true);
}
if (powerState == true)
{
client.SetDevicePowerStateAsync(selectedLight, false);
}
}当我运行此代码时,整个应用程序都挂起了。当我暂停代码时,它会告诉我它所在的代码行也是:
var powerState = client.GetLightStateAsync(selectedLight).Result.IsOn;我尝试过以不同的方式运行它,我发现当您将.Result添加到代码中时,它会挂起。如果删除.Result.IsOn并注释掉If语句,则程序将正常运行。我不知道哪里出了问题,我希望能得到一些帮助。
发布于 2018-05-22 19:35:34
您尝试调用的方法是异步的。使用Result调用它将导致任务未完成时的阻塞操作。
您可以尝试这样调用var powerState = client.GetLightStateAsync(selectedLight).Result.IsOn;:var lightState = await client.GetLightStateAsync(selectedLight);,然后调用lightState.IsOn。
您可以查看this question来了解await Task<T>和Task<T>.Result之间的区别。
您可以尝试这段代码,看看它是否解决了您的问题。我将事件处理程序设为异步的,这样您就可以等待GetLightStateAsync(selectedLight),这将导致非阻塞调用。
private async void btnPower_Click(object sender, RoutedEventArgs e)
{
var powerState = await client.GetLightStateAsync(selectedLight);
if (!powerState)
{
await client.SetDevicePowerStateAsync(selectedLight, true);
}
else
{
await client.SetDevicePowerStateAsync(selectedLight, false);
}
}https://stackoverflow.com/questions/50466588
复制相似问题