【发布时间】:2016-10-02 18:15:21
【问题描述】:
我有一个程序,它没有任何目的,只是帮助我了解 async 和 await 的工作原理。它是一个控制台应用程序,它解析 XML 并等待返回一个名字,无论是姓氏还是名字。代码如下:
static void Main(string[] args)
{
Task<string> name = GetFirstParsedName();
name.Wait();
if (name.IsCompleted)
{
Console.WriteLine(name.Result);
}
Console.ReadLine();
}
static async Task<string> GetFirstParsedName()
{
string xmlSnippet = @"<person>
<FirstName>Chamir</FirstName>
<Surname>Bodasing</Surname>
<Gender>Male</Gender>
<Nationality>South African</Nationality></person>";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlSnippet);
XmlParser xmlParser = new XmlParser();
Task<string> t_GetFirstName = xmlParser.GetFirstName(xmlDoc);
Task<string> t_GetSurname = xmlParser.GetSurname(xmlDoc);
Task<string> t_firstReturnedName = await Task.WhenAny(new Task<string>[] { t_GetFirstName, t_GetSurname });
string firstReturnedName = await t_firstReturnedName;
return firstReturnedName;
}
static async Task<string> GetFirstName(XmlDocument personXml)
{
string firstName = personXml.SelectSingleNode("//FirstName").InnerText;
await Task.Delay(5000);
return firstName;
}
static async Task<string> GetSurname(XmlDocument personXml)
{
string surname = personXml.SelectSingleNode("//Surname").InnerText;
await Task.Delay(1);
return surname;
}
似乎只有当您不必将值返回给 main 方法时才有意义使用 async 方法。除非这意味着设置一个可以访问的全局类属性。如果不是,为了等待该方法,所有方法都需要是异步的,这反过来意味着返回类型必须是Task<T>。除非我明确地必须编写以下代码(如上面的 main 方法),否则它似乎永远不会结束:
Task<string> name = GetFirstParsedName();
name.Wait();
if (name.IsCompleted)
{
Console.WriteLine(name.Result);
}
我的理解完全正确吗?我必须使用 result 属性来获取此处的值,并且通过阅读有关此内容,这似乎不是最佳做法。
【问题讨论】:
标签: c# asynchronous async-await task-parallel-library