C # LIifxNet Toggle Light Power, LIFX - PullRequest
0 голосов
/ 22 мая 2018

Я использую пакет nuget под названием LifxNet от 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 Ответ

0 голосов
/ 22 мая 2018

Метод, который вы пытаетесь вызвать, является асинхронным.Вызов его с помощью 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);
    }
}
...