C#task.wait方法调用未完成

时间:2018-07-12 22:42:47

标签: c# asynchronous task

我试图更好地理解C#中的“任务”和“异步”操作,并且正在运行此示例程序,但是我对输出感到困惑。当我运行此命令时,有时

之后,程序不会在CallMethod中输出控制台输出
int length = await task

有时是这样,但是当我取消注释

Console.ReadLine()

它始终运行所有CallMethod。

using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

namespace Tasks1
{
    class Program
    { 
        static void Main(string[] args)
        {
            Task task = new Task(CallMethod);
            task.Start();
            task.Wait();
            //Console.ReadLine();
        }

    static async void CallMethod()
    {
        string filePath = "/Users/testname/Projects/Tasks1/Tasks1/Sample.txt";
        Task<int> task = ReadFile(filePath);

        Console.WriteLine("Other Work 1");
        Console.WriteLine("Other Work 2");
        Console.WriteLine("Other Work 3");

        int length = await task;
        Console.WriteLine(" Total Length: " + length);

        Console.WriteLine("After work 1");
        Console.WriteLine("After work 2");

    }

    static async Task<int> ReadFile(string file)
    {
        int length = 0;

        Console.WriteLine("File reading is starting");

        using (StreamReader reader = new StreamReader(file))
        {
            string s = await reader.ReadToEndAsync();

            length = s.Length;
        }
        Console.WriteLine("File reading is complete");
        return length;
    }


}
}

Not finishing CallMethod Finishing CallMethod

1 个答案:

答案 0 :(得分:7)

async void-始终为async void :)基本上,除非您非常了解使用它的原因,否则不要使用async void。呼叫路径无法了解async void的完成状态,因此从呼叫者的角度来看它将运行到第一个非同步await。在那之后,您将处于线程竞争的情况。由于它不报告状态,因此它不能参与最外面的Wait()(或await)。当所有非后台线程完成时,exe将退出,因此:有时它可能会起作用,但多数情况下不会起作用。添加Console.ReadLine()会迫使它等待更长的时间,因此会起作用。

基本上:使CallMethod返回Task

顺便说一句:使用最新的C#版本,您也可以将Main方法设为async

    static async Task Main(string[] args) {...}

然后您可以在awaitMain。您应该Wait()完成某项任务的次数几乎为零;通常您应该更喜欢await

相关问题