【问题标题】:C# LIifxNet Toggle Light Power, LIFXC# LIifxNet 切换光功率,LIFX
【发布时间】:2018-11-01 03:46:47
【问题描述】:

我使用 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 语句,那么程序将运行良好。 我不知道出了什么问题,希望能得到一些帮助。

【问题讨论】:

    标签: c# lifx


    【解决方案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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多