【问题标题】:Whats the best/safest way to run an async method on pageload?在页面加载时运行异步方法的最佳/最安全方法是什么?
【发布时间】:2015-05-16 20:54:00
【问题描述】:

我有一个从磁盘加载数据的异步方法(使用 Json)。

但是,当我在 StartupPage() 或 OnNavigatedTo() 中运行该方法时,我不能使用 await 运算符,因为这些不是异步方法。代码仍会运行,但我收到警告说它没有“等待”。

有没有在启动/导航到时运行异步方法的好方法?

【问题讨论】:

  • 在调用 someMethodAsync().Result 等方法后追加结果;
  • @Aaron,这会导致 UI 线程死锁。

标签: c# wpf async-await


【解决方案1】:

您需要在OnNavigatedTo() 上使用async 以避免警告..

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    try
    {
        if (!App.ViewModel.IsDataLoaded)
        {
            await App.ViewModel.LoadData();
        }
    }
    catch (Exception ex)
    {
        ...
    }
}

【讨论】:

  • 谢谢 - 我把这个添加到我的方法中
【解决方案2】:

在初始化时启动 async 方法是可以的,但您必须确保您的初始化工作流程没有被 async 调用破坏。

#pragma 或 ContinueWith 调用可以抑制有关未等待异步方法调用的警告。我更喜欢最后一个来抑制这个警告,请调查扩展方法的以下代码。

public static void LogAsyncError(this Task task, [LocalizationRequired(false)] string message = null)
{
    if (task == null)
    {
        return;
    }

    task.ContinueWith(t =>
    {
        var log = Logger.Create("Task error logger");

        if (string.IsNullOrEmpty(message))
        {
            log.Error(t.Exception);
        }
        else
        {
            log.Error(message, t.Exception);
        }
    }, TaskContinuationOptions.OnlyOnFaulted);
}

所以现在您可以在没有警告和错误日志的情况下调用异步方法。

SomeMethodAsync().LogAsyncError();

【讨论】:

  • 谢谢 - 这真的很有帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多