c# - 构造函数中的 WinRT 异步数据加载

标签 c# windows-runtime async-await

我想在 ViewModel 的构造函数中加载一些数据,但由于 WinRT 的异步性质,我不得不使用异步方法。不幸的是我没有异步构造函数,所以我试图将异步方法用作同步方法。我确信有一种更好的方法可以在应用程序加载时加载数据(异步),但我现在脑子一片空白。

我正在寻找一种方法来使用我正在下降的思路修复我的应用程序,或者使用更合适的方法永久修复此问题。

代码非常简单(甚至缺少 ViewModel)只是为了演示我面临的问题。

public sealed partial class MainPage : Page
{

    public string Data { get; set; }

    public DataService _dataService { get; set; }

    public MainPage()
    {
        this.InitializeComponent();

        _dataService = new DataService();
        var t = _dataService.GetData();

        Data = t.Result;
    }

    /// <summary>
    /// Invoked when this page is about to be displayed in a Frame.
    /// </summary>
    /// <param name="e">Event data that describes how this page was reached.  The Parameter
    /// property is typically used to configure the page.</param>
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
    }


}

public class DataService
{
    public async Task<string> GetData()
    {
        //Force async
        await Task.Delay(1);

        return "Hello";
    }
}

亲切的问候

最佳答案

我最近写了一篇关于 async in constructors 的博文.

简而言之,我更喜欢async 工厂方法:

public sealed class MyViewModel : INotifyPropertyChanged
{
  private readonly DataService _service;

  private MyViewModel(DataService service)
  {
    _service = service;
  }

  private async Task InitializeAsync()
  {
    var result = await _service.GetData(); // async initialization

    Data = result; // update data-bound properties with the results
  }

  // Data triggers INotifyPropertyChanged on write
  public string Data { get { ... } set { ... } }

  public static async Task<MyViewModel> CreateAsync()
  {
    var ret = new MyViewModel();
    await ret.InitializeAsync();
    return ret;
  }
}

关于c# - 构造函数中的 WinRT 异步数据加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14449349/

相关文章:

c# - 从 WRL COM 组件获取托管回调

c# - 在任务中等待异步/等待

c# - 在 C# 中使用 DNS SRV 记录

c# - 如何根据 MessageBox 选择显示对话框

c# - FolderPicker 在 UWP Windows 10 应用程序(移动)中不起作用

SQLite for Windows Runtime 返回 "ReadOnly"错误 SQLiteException 对象

redis - 如何在异步 tokio 运行时中将 future::join_all 与多路复用的 redis 一起使用

javascript - 如何从 Array.map() 函数正确返回异步数据

c# - 如何用位图C#创建圆

c# - 我如何在 Unity 中使用具有不同道路或平台颜色的重复场景以及在前一个场景中使用的相同预制件?