0

我不知道为什么我无法从异步方法调用中获取返回值。

我没有收到任何错误。

ReadAsync方法没有完全执行,使我无法逐步完成剩余的代码行

请帮忙。你是我唯一的希望...

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        QuoteParameters quote = e.Parameter as QuoteParameters;
        Debug.Assert(quote != null);

        var task = _viewModel.GenerateQuote(quote);
        string address = task.Result;
        webView.Source = new Uri(address);
    }

    public async Task<string> GenerateQuote(QuoteParameters quote)
    {
        var documentedQuote = quote.Convert();
        var task = QuoteGenerator.Execute(documentedQuote);

        string filePath = await task; **// EXECUTION STOPS AT THIS POINT!**

        return filePath;
    }


    public async static Task<string> Execute(QuoteParameters quote)
    {
        string html = string.Empty;

        foreach (var service in quote.Services)
        {
            var quoteTemplateTask = IO.ReadAsync(TEMPLATES_DIRECTORY, DOC_TEMPLATE);
            string quoteTemplate = await quoteTemplateTask;

            var serviceTemplateTask = IO.ReadAsync(TEMPLATES_DIRECTORY, SERVICE_TEMPLATE);
            string serviceTemplate = await serviceTemplateTask;

            var serviceAppliedTemplate = Apply(quoteTemplate, quote.Services, serviceTemplate);

            var materialTemplate = IO.ReadAsync(TEMPLATES_DIRECTORY, MATERIAL_TEMPLATE);
            html = Apply(serviceAppliedTemplate, service.Materials, await materialTemplate);
        }

        return await SaveAsync(html);
    }

    public static async Task<string> ReadAsync(string directoryExtension, string fileName)
    {
        string filePath = BuildPath(directoryExtension, fileName);
        string directoryName = Path.GetDirectoryName(filePath);

        StorageFolder storageFolder = await StorageFolder.GetFolderFromPathAsync(directoryName);
        StorageFile storageFile = await storageFolder.GetFileAsync(fileName); **// EXECUTION STOPS HERE**

        IRandomAccessStream randomAccessStream = await storageFile.OpenAsync(FileAccessMode.Read);
        IInputStream inputstream = randomAccessStream.GetInputStreamAt(0);
        DataReader dataReader = new DataReader(inputstream);

        var numberOfBytesLoaded = dataReader.LoadAsync((uint)randomAccessStream.Size);

        return dataReader.ReadString(await numberOfBytesLoaded);
    }
4

1 回答 1

1

你的问题在OnNavigatedTo. 具体来说,您的调用Task.Result导致死锁。不要阻塞async代码

你可以试试这个,但我不确定效果如何(该方法将在设置之前返回OnNavigatedTo,这可能不是你想要的):asyncwebView.Source

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    QuoteParameters quote = e.Parameter as QuoteParameters;
    Debug.Assert(quote != null);

    var task = _viewModel.GenerateQuote(quote);
    string address = await task;
    webView.Source = new Uri(address);
}
于 2012-09-26T13:44:24.677 回答