将同步调用更改为异步

时间:2015-02-04 10:45:55

标签: c# .net task-parallel-library async-await task

我在库 Helper.dll 中有以下代码。该程序集包含一个名为 Products.XML 的嵌入式XML文件。方法GetProducts运行正常。但它需要几秒钟才能响应,因为它是同步的。我想在这个加载操作进行时释放UI。

没有异步调用可用于 LINQ to XML 操作,例如XDocument.Load,因此我无法在此使用asyncawait

感谢任何答案。

public static class LookupUtil
{
    public static IEnumerable<XElement> GetProducts()
    {
        var stream = Assembly.
            GetExecutingAssembly().
            GetManifestResourceStream("Helper.Products.XML");
        var reader = new XmlTextReader(stream);
        var document = XDocument.Load(reader);

        return document.Descendants("Products");
    }
}

1 个答案:

答案 0 :(得分:3)

如果您在该方法中没有任何异步操作,请不要更改它并保持同步

当您从UI线程调用它时,使用Task.Run将同步工作卸载到另一个线程并await返回的任务:

var elements = await Task.Run(() => LookupUtil.GetProducts());

你基本上做的是异步处理同步代码块。