为什么在异步完成任务之前程序退出?

时间:2015-03-22 14:56:20

标签: c# asynchronous visual-studio-2013

我认为这是一个非常多余的问题,但我确实深挖并且没有找到答案。我正在使用一个非常虚拟的例子here,第一个。

我创建了一个Windows窗体应用程序,我在main中删除了自动生成的代码,然后复制并通过示例站点中的代码。

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    //[STAThread]
    static void Main()
    {
        // Create task and start it.
        // ... Wait for it to complete.
        Task task = new Task(ProcessDataAsync);
        task.Start();
        task.Wait();
    }

    static async void ProcessDataAsync()
    {
        // Start the HandleFile method.
        Task<int> task = HandleFileAsync("D:\\test.txt");

        // Control returns here before HandleFileAsync returns.
        // ... Prompt the user.
        Console.WriteLine("Please wait patiently " +
            "while I do something important.");

        // Wait for the HandleFile task to complete.
        // ... Display its results.
        int x = await task;
        Console.WriteLine("Count: " + x);
    }

    static async Task<int> HandleFileAsync(string file)
    {
        Console.WriteLine("HandleFile enter");
        int count = 0;

        // Read in the specified file.
        // ... Use async StreamReader method.
        using (StreamReader reader = new StreamReader(file))
        {
            string v = await reader.ReadToEndAsync();

            // ... Process the file data somehow.
            count += v.Length;

            // ... A slow-running computation.
            //     Dummy code.
            for (int i = 0; i < 10000; i++)
            {
                int x = v.GetHashCode();
                if (x == 0)
                {
                    count--;
                }
            }
        }
        Console.WriteLine("HandleFile exit");
        return count;
    }
}

输出结果为:

  

HandleFile输入   线程0x8184已退出代码259(0x103)。   线程0x6764已退出,代码为259(0x103)。   程序'[42112] testasyncforms.vshost.exe'已退出,代码为0(0x0)。   我做一些重要的事情时请耐心等待。

那么,为什么程序退出而不打印“HandleFile退出”?

1 个答案:

答案 0 :(得分:4)

因为new Task(ProcessDataAsync);没有达到你想要的效果。

由于async void模式仅用于异步事件处理,因此我建议您通过Task方法返回ProcessDataAsync,然后只需.Wait()在那个任务上。