C # LIifxNet Toggle Light Power, LIFX

Tom upton спросил: 28 апреля 2018 в 09:50 в: c#

Я использую пакет nuget под названием LifxNet by dotMorten. Я могу изменить цвет лампы и включить ее и выключить. Теперь я хочу иметь кнопку, которая переключает мощность лампы. Я пытаюсь использовать метод 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 ответ

Antoine Thiry ответил: 28 апреля 2018 в 09:55

Метод, который вы пытаетесь вызвать, является асинхронным. Вызов с помощью Result приведет к операции блокировки, когда задача не будет завершена.

Вы можете попробовать вызвать var powerState = client.GetLightStateAsync(selectedLight).Result.IsOn; следующим образом: var lightState = await client.GetLightStateAsync(selectedLight);, а затем lightState.IsOn.

Вы можете посмотреть этот вопрос , чтобы узнать разницу между 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);
    }
}