什么是在pageload上运行异步方法的最佳/最安全的方法?

时间:2015-05-15 12:03:31

标签: c# wpf async-await

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

但是,当我在StartupPage()或OnNavigatedTo()中运行该方法时,我不能使用await运算符,因为这些不是异步方法。代码仍将运行,但我收到警告,表示它尚未等待。

在启动/导航到运行异步方法有什么好方法吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

在初始化时启动异步方法是可以的,但是必须确保异步调用不会破坏初始化工作流。

#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();