HTTP Async Post в c #, Raspberry Pi, данные не пост - PullRequest
0 голосов
/ 18 января 2019

Асинхронный метод HTTP не работает, и данные никогда не публикуются, когда я запускаю это в raspberry pi.Метод дистанционного мониторинга все еще работает, но только данные не публикуют Коды

IUltrasonicRangerSensor sensor = DeviceFactory.Build.UltraSonicSensor(Pin.DigitalPin8);
private int distance = 200;

int count = 0;
ILed ledRed = DeviceFactory.Build.Led(Pin.DigitalPin5);
ILed ledGreen = DeviceFactory.Build.Led(Pin.DigitalPin6);

private void Sleep(int NoOfMs)
{
    Task.Delay(NoOfMs).Wait();
}

private async void startDistanceMonitoring()
{
    await Task.Delay(100);
    int distanceRead = 200;
    while (true)
    {
        Sleep(1000);
        count++;
        distanceRead = sensor.MeasureInCentimeters();
        if (distanceRead < 200 && distanceRead > 0)
            distance = distanceRead;
        await sendtoapi();
    }
}

private async Task sendtoapi()
{
    using (var client = new HttpClient())
    {
        var values = new Dictionary<string, string>
        {
            { "userName", "qwee" }
        };

        var content = new FormUrlEncodedContent(values);

        var response = await client.PostAsync("https://google.com", content);

        Sleep(10000);
        var responseString = await response.Content.ReadAsStringAsync();
    }
}

public void Run(IBackgroundTaskInstance taskInstance) 
{ 
    startDistanceMonitoring();
    Sleep(300);
    Debug.WriteLine("count = " + count + " ,distance=" + distance);
    while (true)
    {
        if (distance >= 150)
        {
            Debug.WriteLine("EMPTY LOT");
            Sleep(1000);
            ledGreen.ChangeState(SensorStatus.On);
            ledRed.ChangeState(SensorStatus.Off);

        }
    }
}

1 Ответ

0 голосов
/ 18 января 2019

Когда вы делаете async / await, вы в основном хотите, чтобы все (большинство) ваших методов работали в режиме async / await. На данный момент ваши смешанные асинхронные и не асинхронные вызовы методов. Это называется блокировкой в ​​контексте async, и его следует избегать , не в последнюю очередь из-за того, что это может привести к тупикам. Я хотел бы предложить вам прочитать хотя бы Async / Await - Лучшие практики в асинхронном программировании

В общем (и, чтобы несколько упростить задачу) все ваши методы должны иметь сигнатуру

public async Task method()
{

}

и все ваши методы должны быть вызваны:

await method();

Вот пара вещей, которые вы делаете неправильно

private async void startDistanceMonitoring()

Никогда не использовать async void (это только для асинхронных обработчиков событий)

private void Sleep(int NoOfMs)
{
    Task.Delay(NoOfMs).Wait();
}

это блокировка, это должно быть

private async Task Sleep(int NoOfMs)
{
    await Task.Delay(NoOfMs);
}

При звонке:

startDistanceMonitoring();

startDistanceMonitoring - это метод async, но вы его не ожидаете. Так что ваша программа может очень хорошо завершиться, прежде чем она будет завершена. Это должно быть:

await startDistanceMonitoring();

Вы делаете это неправильно во всем этом блоке кода. Всегда вызывать async методы с await.

Ваш метод ввода не async, public void Run(IBackgroundTaskInstance taskInstance) должен быть public async Task Run(IBackgroundTaskInstance taskInstance)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...