加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#LIifxNet切换光功率,LIFX

发布时间:2020-12-16 07:23:18 所属栏目:百科 来源:网络整理
导读:我使用dotMorten命名为LifxNet的nuget包.我可以改变灯泡的颜色并打开和关闭它.我现在想要一个能够切换灯泡功率的按钮.我正在尝试使用方法GetLightStateAsync()来检查灯是打开还是关闭. private void btnPower_Click(object sender,RoutedEventArgs e){ var p
我使用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语句,那么程序将运行正常.
我无法弄清楚出了什么问题,我将不胜感激.

解决方法

您尝试调用的方法是异步的.使用Result调用它将导致在Task未完成时执行阻塞操作.

您可以尝试调用var powerState = client.GetLightStateAsync(selectedLight).Result.IsOn;
?这样:var lightState = await client.GetLightStateAsync(selectedLight);然后是lightState.IsOn.

您可以查看this question以了解等待任务< T>之间的区别.和任务< 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);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读