Возврат и работа с объектом Task из асинхронного методаC#

Место общения программистов C#
Ответить
Anonymous
 Возврат и работа с объектом Task из асинхронного метода

Сообщение Anonymous »

Для справки: я создаю небольшое устройство спутникового трекера с формой/программой C# [работающей в .NET8], которая взаимодействует с микроконтроллером, управляющим отдельным устройством. Приложение позволяет пользователю ввести идентификатор Norad и отобразить имя (например, МКС), текущую долготу, широту, высоту и т. д.
В любом случае, я изо всех сил пытаюсь обернуть голову вокруг возврата задачи. У меня есть метод (ниже), который выполняет вызов API и обрабатывает анализ JSON. В моей первой версии у меня был бесконечный цикл, который непрерывно передавал данные по последовательному порту на небольшой дисплей ESP32 и не требовал ничего возвращать.
Однако сейчас я создаю правильный пользовательский интерфейс и получение данных формы пользовательского ввода для выполнения вызова API, а затем передача дополнительных сведений для хранения в моей базе данных.

Код: Выделить всё

public async Task FetchSatName(string NoradId) {
SatelliteInfo sat = new SatelliteInfo();
var parser = new ParseJson();
var user = new UserInfo();

sat.NoradId = int.Parse(NoradId);

var simpleuri = "https://api.n2yo.com/rest/v1/satellite/tle/" + sat.NoradId + "&apiKey=" + user.ApiKey;
var client = new HttpClient();
var request = new HttpRequestMessage {
Method = HttpMethod.Get,
RequestUri = new Uri(simpleuri),
};

using (var response = await client.SendAsync(request)) {
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);

sat.SatelliteName = parser.JMethodString(body);
sat.NoradId = parser.JMethodDub(body);
var list = parser.JMethodList(body);
Console.WriteLine("\n\nSat: \t\t" + sat.SatelliteName);
Console.WriteLine("SatID: \t\t" + sat.NoradId);

return sat;
}
}
Класс SatelliteInfo:

Код: Выделить всё

public class SatelliteInfo
{
public string SatelliteName { get; set; }
public int NoradId { get; set; }
public decimal Period { get; set; }
}
Метод вызова: (это явно событие нажатия кнопки, поэтому не думайте, что я смогу сделать это асинхронным)

Код: Выделить всё

private void addSatelliteIDButton_Click(object sender, EventArgs e)
{
if (ValidateSatelliteIDForm())
{
SatelliteInfo satellite = new SatelliteInfo();
satellite.NoradId = int.Parse(newSatelliteIDBox.Text);

// TODO -- Fix to take in satellite object
var satReturned = FetchSatName(newSatelliteIDBox.Text);

// Do other things, then store data in db
}
else
{
MessageBox.Show("Enter a valid Norad ID");
}
}

Мне бы хотелось вернуть свой объект с уже заполненными свойствами, однако, когда я пытаюсь вернуть свой объект из асинхронной функции, он сообщает мне, что мне нужно вернуть задачу. Как мне с этим работать? Я уверен, что есть лучший способ справиться с этой ситуацией, но с С# все еще не все в порядке. Поле сохранения информации о пользователе у меня работает, но это все, что вводит пользователь, и оно не зависит от получения данных откуда-либо еще.
Снимок экрана формы
Конечно, мы очень ценим любую помощь.
Я старался просто не использовать асинхронную функцию, но со всеми методами HTTP-клиента (несколько у меня в голове, как на самом деле работает асинхронность), это было кричит на меня, что это должно быть асинхронно.

Подробнее здесь: https://stackoverflow.com/questions/790 ... ync-method
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»