C#LIifxNet切换光功率,LIFX

时间:2018-05-22 11:30:06

标签: c# lifx

我使用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语句,那么程序将运行正常。 我无法弄清楚出了什么问题,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

您尝试调用的方法是异步的。使用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);
    }
}