首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# LIifxNet切换光功率,LIFX

C# LIifxNet切换光功率,LIFX
EN

Stack Overflow用户
提问于 2018-05-22 19:30:06
回答 1查看 105关注 0票数 4

我使用的是dotMorten提供的一个名为LifxNet的nuget包。我可以改变灯泡的颜色,打开和关闭它。我现在想有一个按钮,可以切换灯泡的功率。我尝试使用GetLightStateAsync()方法来检查灯是开着还是关着的。

代码语言:javascript
复制
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);
    }
}

当我运行此代码时,整个应用程序都挂起了。当我暂停代码时,它会告诉我它所在的代码行也是:

代码语言:javascript
复制
var powerState = client.GetLightStateAsync(selectedLight).Result.IsOn;

我尝试过以不同的方式运行它,我发现当您将.Result添加到代码中时,它会挂起。如果删除.Result.IsOn并注释掉If语句,则程序将正常运行。我不知道哪里出了问题,我希望能得到一些帮助。

EN

回答 1

Stack Overflow用户

发布于 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),这将导致非阻塞调用。

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50466588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档