【问题标题】:Async ObservableCollection from Interface in C# (Xamarin)来自 C# 中接口的异步 ObservableCollection (Xamarin)
【发布时间】:2018-10-09 13:30:37
【问题描述】:

我在一个界面中有一个ObservableCollection,我将它与RestApi-Request 一起使用。它有一些等待功能,它必须是异步的。但是有一个错误。

界面如下:

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>

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: c# xamarin interface


    【解决方案1】:
    public interface IDbConnection
    {
        Task<ObservableCollection<Einkauf>> GetEinkauf();
    }
    
    public async Task<ObservableCollection<Einkauf>> GetEinkauf()
    {
      ...
    }
    

    【讨论】:

      【解决方案2】:

      如果 GetEinkauf 应该被实现为异步方法,则应将其返回类型更改为 Task&lt;ObservableCollection&lt;Einkauf&gt;&gt; 并将其名称更改为 GetEinkaufAsync 以遵循异步方法的命名约定:

      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;
      }
      

      然后您可以从标记为async 的任何方法中await 方法:

      var collection = await GetEinkaufAsync();
      

      如果另一个类出于某种原因以同步方式实现IDbConnection 接口,它可以使用Task.FromResult 方法返回Task&lt;ObservableCollection&lt;Einkauf&gt;&gt;

      public class SomeOtherClass : IDbConnection
      {
          public Task<ObservableCollection<Einkauf>> GetEinkaufAsync()
          {
              return Task.FromResult(new ObservableCollection<Einkauf>());
          }
      }
      

      【讨论】:

      • 缺少一件事:return 'await' Task.FromResult(_einkauf);
      猜你喜欢
      • 2014-04-04
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 2018-01-21
      相关资源
      最近更新 更多