如何执行方法返回的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
相关产品推荐
相关产品推荐

