在静态方法中使用async函数

时间:2012-11-26 17:08:30

标签: c# asynchronous async-await

我有一个静态方法,我在其中调用async方法(xmlHelper.LoadDocument())。我在Setter部分的一个属性中调用此方法

internal static IEnumerable<Word> LoadTenWords(int boxId)
{
     XmlHelper xmlHelper = new XmlHelper();
     XDocument xDoc = xmlHelper.LoadDocument().Result;
     return xDoc.Root.Descendants("Word").Single(...)
} 

如您所知,LoadTenWord是静态的,不能是异步方法,因此我使用Result属性调用LoadDocument。当我运行我的应用程序时,应用程序不起作用,但是当我调试它并且我在下面的行中等待

XDocument xDoc = xmlHelper.LoadDocument().Result;
一切都好!我认为,没有await关键字,C#不会等待该过程完成。

你对解决我的问题有什么建议吗?

2 个答案:

答案 0 :(得分:12)

该方法为static的事实意味着它无法标记为async

internal static async Task<IEnumerable<Word>> LoadTenWords(int boxId)
{
    XmlHelper xmlHelper = new XmlHelper();
    XDocument xDoc = await xmlHelper.LoadDocument();
    return xDoc.Root.Descendants("Word").Select(element => new Word());
}

使用Result会导致方法阻塞,直到任务完成。在您的环境中,这是一个问题;您需要阻止但仅await任务(或使用延续来处理结果,但await 更多更容易)。< / p>

答案 1 :(得分:-3)

internal static IEnumerable<Word> LoadTenWords(int boxId)
{
    var task = new XmlHelper().LoadDocument();
    task.Wait();
    return from word in task.Result.Root.Descendants("Word")
}