You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何执行方法返回的Task并获取其结果?

如何执行方法返回的Task并获取其结果?

嘿,我来帮你搞定这个问题~首先得指出你代码里的一个小坑:你在DoWork里只是创建了Task对象,但根本没启动它,所以直接拿到这个Task的话,它是不会执行的。下面给你几种正确的处理方式,从推荐到不推荐依次说:


1. 最推荐:用异步方式await(现代C#首选)

这是异步编程的标准做法,不会阻塞线程,适合绝大多数场景。首先我们先把DoWork改成更规范的写法(别再用new Task了,用Task.Run或者直接写async方法更简洁):

写法一:用Task.Run创建并启动Task

public class Test
{
    public static Task<string> DoWork()
    {
        // Task.Run会自动创建并启动Task,不用手动调用Start()
        return Task.Run(() =>
        {
            return "Test Message";
        });
    }   
}

然后把Main改成异步方法(C# 7.1及以上支持async Main):

public static async Task Main()
{
    // 用await等待Task完成,直接拿到结果
    var result = await Test.DoWork();
    Console.WriteLine(result); // 输出:Test Message
}

写法二:把DoWork改成async方法

如果你的DoWork里本来就有异步操作(比如调用其他async方法),直接写async方法更自然:

public class Test
{
    public static async Task<string> DoWork()
    {
        // async方法里可以直接返回字符串,编译器会自动包装成Task<string>
        // 如果有异步逻辑,比如 await File.ReadAllTextAsync("test.txt");
        return "Test Message";
    }   
}

Main方法的用法和上面一样,用await直接拿结果就行。


2. 同步场景下的处理(不推荐,万不得已才用)

如果你因为环境限制只能用同步方法(比如旧版本C#不支持async Main),可以用Wait()等待Task完成,再用Result获取结果,但要注意两个问题:

  • 会阻塞当前线程直到Task完成,不适合UI应用或高并发场景
  • 如果Task执行时抛出异常,Wait()和Result会把异常包装成AggregateException,需要额外处理

代码示例:

public static void Main()
{
    var task = Test.DoWork();
    task.Wait(); // 阻塞线程直到Task完成
    var result = task.Result;
    Console.WriteLine(result);
}

3. 修正你原来的代码(不推荐这种写法)

如果非要保留new Task的写法,那你必须手动调用Start()启动Task才能让它执行:

public class Test
{
    public static Task<string> DoWork()
    {
        var a = new Task<string>(() =>
        {
              return "Test Message";
        });
        a.Start(); // 必须加这行,否则Task永远不会执行
        return a;
    }   
}

但这种写法已经过时了,现在大家都用Task.Run或者async/await,没人再手动new Task然后Start()了,太麻烦还容易忘。


备注:内容来源于stack exchange,提问作者user28395223

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:39:31