在等待异步方法中包含的非异步操作时,应用程序会爆炸

时间:2016-02-03 12:53:42

标签: c# asynchronous async-await

我正在调用没有异步接口的第三方程序集,但我的代码是异步的。我在等待操作时可以做的工作,所以我将它包装在异步中以允许干净的调用代码。

    static Task<string[]> GetRequiredFields(string path)
    {
        return Task.Run(() =>
        {
            Aspose.Words.Document doc = null;
            try
            {
                doc = new Aspose.Words.Document(path);
            }
            catch
            {
                throw new Exception("Failed to load doc");
            }

            return doc.MailMerge.GetFieldNames();
        });
    }

我理解这是包装它的正确方法。我从方法名称本身中省略了单词async,以暗示调用者实际上并不是真正的异步。

这有效

    var thetask = GetRequiredFields(merge.DocxPath);

    var result = thetask.Result;

这不是

    var thetask = await GetRequiredFields(merge.DocxPath);

不是&#39;我的意思是如果我把它包起来它不会抛出异常。它只是立即轰炸整个应用程序。所以我不太清楚async关键字的包含与直接访问结果有什么不同。

如果我单步执行代码,我发现它在我在包装代码中实例化文档的行中断了。它不会被捕获。跨越文档行是调试器分离并退出应用程序的时间。

0 个答案:

没有答案