簡體   English   中英

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

[英]C# task.wait method called not finished

我試圖更好地理解C#中的“任務”和“異步”操作,並且正在運行此示例程序,但是我對輸出感到困惑。 當我運行此命令時,有時程序不會在CallMethod中輸出Console輸出

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;
    }


}
}

未完成CallMethod 完成CallMethod

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) {...}

然后,您可以在Main await 您應該對一個任務執行Wait()的次數幾乎為零; 通常你應該喜歡await

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM