提问者:小点点

从任务返回某个值


我有一个简单的XML来自URL解析器,如下所示:

static async Task<string> TestReader(string URL)
        {
            string XMLtext = "";
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.Async = true;

            using (XmlReader reader = XmlReader.Create(URL, settings))
            {
                while(await reader.ReadAsync())
                {
                    switch(reader.NodeType)
                    {
                        case XmlNodeType.Element:
                            XMLtext += reader.LocalName;
                            break;
                        case XmlNodeType.Text:
                            XMLtext += reader.GetValueAsync();
                            break;
                    }
                }
                return XMLtext;
            }
        }

我想在我的控制台应用程序中测试它,但是我不知道如何从解析器返回XML文本。我在Main函数中有这样的代码,但它并不像我想要的那样工作:

static void Main(string[] args)
        {
            Task T = TestReader("http://somewebsite/YML.xml");
            Console.WriteLine(Convert.ToString(T));
        }

它返回如下内容:“System.Runtime.CompilerServices.AsynctAskMethodBuilder 1+AsyncStateMachineBox1[System.String,ParserXml.Program+D__0]”。

我还尝试了t.start(),但编译器给我一个运行时错误“start可能不被调用对一个promise-style task”。

有可能在屏幕上打印XMLtext吗?


共2个答案

匿名用户

您需要await方法来获取返回的字符串。这意味着您的方法也要异步

static async Task Main(string[] args)
{
    string result = await TestReader("http://somewebsite/YML.xml");
    Console.WriteLine(result);
}

匿名用户

要么按照@Canton7所说的做,要么从非异步方法调用异步方法:

var result = Task.Run(() => TestReader("http://somewebsite/YML.xml")).Result;