如何在Main中正确调用Await方法?

时间:2015-06-29 14:32:57

标签: c# asynchronous async-await

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TaskConsole
{
    class Program
    {
        static void Main(string[] args)
        {       
             test();    
        }

        static async Task<string> ReadTextAsync() 
        {
            string textContents;
            Task<string> readFromText;

            using (StreamReader reader =  File.OpenText("email.txt"))
            {
                readFromText = reader.ReadToEndAsync();
                textContents = await readFromText;

            }

            return textContents;     
        }

        static async Task test ()
        {
            string capture = await ReadTextAsync();
            Console.WriteLine(capture);
        }               
    }               
}

我有以下代码使用async从文本文件中读取。我从这个post中了解到,Microsoft使用StreamReader实现的示例是不正确的,因此作为学习练习,我决定纠正它。当测试方法没有返回任何任务时,我如何正确地从main调用测试方法。我做了一点阅读并了解了使用async void的不良做法。在我的情况下,我该怎么办?

旁注:我不知道我是否实施错误,但我无法显示我的文字。我尝试了非异步方式并且它有效,但是,当我使用异步它显示空白时,请按任意键继续&#34;

2 个答案:

答案 0 :(得分:5)

  

当测试时,我如何正确地从main调用测试方法   方法不会返回任何任务。

由于Main无法修改为async,因此您必须明确地在其上调用Task.Wait

Test().Wait();

这是您应该在异步调用中阻止的唯一

答案 1 :(得分:0)

static async Task<string> ReadTextAsync() 
        {
            string textContents;
            Task<string> readFromText;

            using (StreamReader reader =  File.OpenText("email.txt"))
            {
                readFromText = await Task.Run(() => reader != null ? reader.ReadToEndAsync() : null);
                textContents = readFromText;

            }

            return textContents;     
        }

        static Task test ()
        {
            string capture = ReadTextAsync();
            Console.WriteLine(capture);
        }