Async ObservableCollection из интерфейса в C # (Xamarin) - PullRequest
0 голосов
/ 09 октября 2018

У меня есть ObservableCollection в интерфейсе, и я использую его с RestApi-Request.Он имеет некоторые функции Await и должен быть асинхронным.Но есть ошибка.

Вот интерфейс:

public interface IDbConnection
{
    ObservableCollection<Einkauf> GetEinkauf();
}

Вот часть из класса, которую он использует:

public partial class RestView : IDbConnection
{
    private ObservableCollection<Einkauf> _einkauf;
    private const string Url = "http://localhost:3003/einkauf";
    private HttpClient _client = new HttpClient();

    public RestView ()
    {
        InitializeComponent ();
    }

    public async ObservableCollection<Einkauf> GetEinkauf()
    {
        var content = await _client.GetStringAsync(Url);
        var einkauf = JsonConvert.DeserializeObject<List<Einkauf>>(content);
        _einkauf = new ObservableCollection<Einkauf>(einkauf);
        speisenListe.ItemsSource = _einkauf;
        return _einkauf;
    }

}

GetEinkauf подчеркнут ион говорит:

CS1983 C# The return type of an async method must be void, Task or Task<T>

Кто-нибудь знает, как это исправить?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Если GetEinkauf предполагается реализовать как асинхронный метод, вы должны изменить его тип возвращаемого значения на Task<ObservableCollection<Einkauf>>, а также изменить его имя на GetEinkauf Async , чтобы следовать соглашению об именах для асинхронных методов:

public interface IDbConnection
{
    Task<ObservableCollection<Einkauf>> GetEinkaufAsync();
}

public async Task<ObservableCollection<Einkauf>> GetEinkaufAsync()
{
    var content = await _client.GetStringAsync(Url);
    var einkauf = JsonConvert.DeserializeObject<List<Einkauf>>(content);
    _einkauf = new ObservableCollection<Einkauf>(einkauf);
    speisenListe.ItemsSource = _einkauf;
    return _einkauf;
}

Затем вы можете await метод из любого метода, помеченного как async:

var collection = await GetEinkaufAsync();

Если другой класс реализует интерфейс IDbConnection синхронно для некоторыхпричина, это могло бы использовать Task.FromResult метод, чтобы возвратить Task<ObservableCollection<Einkauf>>:

public class SomeOtherClass : IDbConnection
{
    public Task<ObservableCollection<Einkauf>> GetEinkaufAsync()
    {
        return Task.FromResult(new ObservableCollection<Einkauf>());
    }
}
0 голосов
/ 09 октября 2018
public interface IDbConnection
{
    Task<ObservableCollection<Einkauf>> GetEinkauf();
}

public async Task<ObservableCollection<Einkauf>> GetEinkauf()
{
  ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...