从C#(Xamarin)中的Interface异步ObservableCollection

时间:2018-10-09 13:30:38

标签: c# xamarin interface

我在界面中有一个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 :(得分:2)

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

public async Task<ObservableCollection<Einkauf>> GetEinkauf()
{
  ...
}

答案 1 :(得分:1)

如果应该将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>());
    }
}