如何获得准确的结果从异步方法通过await没有任务结果

本文关键字:结果 await 任务 何获得 异步方法 | 更新日期: 2023-09-27 18:18:12

我想尝试async和await,但是我失败了。我有一个方法,需要异步运行两个方法(它部分工作)

public void Run()
{
            Task[] tasks = new Task[2];
            tasks[0] = Task.Factory.StartNew(DisplayInt);
            tasks[1] = Task.Factory.StartNew(DisplayString);
            //block thread until tasks end
            Task.WaitAll(tasks);
}

和使用的两个方法

public async void DisplayInt()
    {
        Task<int> task = new Task<int>(
            () => 10);
        task.Start();
        Console.WriteLine(await task);
    }
    public async void DisplayString()
    {
        Task<string> task = new Task<string>(
           () => "ok" );
        task.Start();
        Console.WriteLine(await task);
   }

通常我得到的结果是:1)10 ok

或2)好10

但有时我什么也没得到

如何在不使用task的情况下通过await获得async方法的准确结果。结果还是不能发生?

如何获得准确的结果从异步方法通过await没有任务结果

我建议您阅读一些介绍性文章,比如我自己的async介绍,然后再阅读我在MSDN上关于异步最佳实践的文章。如果你只是胡乱写代码,你最终会很痛苦。

特别地,您不应该使用Task.Factory.StartNew, Task构造函数,也不应该使用Task.Start;你应该避免async void(所有链接都是我的博客,我在那里详细解释了为什么)。

回答你的实际问题:

如何在不使用task的情况下通过await获得async方法的准确结果。结果还是不能发生?

要从任务中获得结果,您可以异步等待任务完成(通过await),也可以同步(阻塞)等待任务完成(通过Result)。如果你问的是"其他方法",那就没有了

欢迎来到SO…

在你的例子中,对于这两个任务,初始化它们需要更多的时间,然后在其中运行方法。这就是为什么有时第二个任务在第一个任务之前完成(如果它在较短的时间内初始化)。如果您将DisplayString方法更改为:

    public static async void DisplayString()
    {
        Task<string> task = new Task<string>(
            () => { Thread.Sleep(10); return "ok"; });
        task.Start();
        Console.WriteLine(await task);
    }

现在DisplayString方法需要大约10毫秒来执行,它将总是导致:

10    
ok

注:正如Stephen Cleary所指出的,你可以阅读一些关于async / await的基本文章。我还建议在WinForms项目上进行测试,而不是在Console上进行测试。