action不能await
class Program { static int i = 0; static async Task Main(string[] args) { for (int i = 0; i < 3; i++) { await RunInNewScopeAsync(async () => { var n1 = await DoWorkAsync(); Console.WriteLine(n1); }); } Console.WriteLine("finished..."); Console.ReadLine(); } static Task RunInNewScopeAsync(Action action) { action(); return Task.CompletedTask; } static async Task<string> DoWorkAsync() { await Task.Delay(1000); return "mxd " + i++; } }
今天审查一处代码(
完整实例:
using System; using System.Threading; using System.Threading.Tasks; class Program { static int i = 0; // 异步方法:模拟一个需要等待的操作 static async Task<string> DoWorkAsync() { // 使用 Task.Delay 进行异步等待 - ✅ 推荐 await Task.Delay(1000); // 等待3秒,期间线程可以去处理其他任务 return "mxd " + i++; } static void RunInNewScope(Action action) { action(); } static Task RunInNewScopeAsync(Action action) { action(); return Task.CompletedTask; } static T RunInNewScopeFunc<T>(Func<T> func) { return func(); } // 主方法必须是 async 才能使用 await static async Task Main(string[] args) { //for (int i = 0; i < 100; i++) //{ // // 调用异步方法并等待其完成 // var n1 = await DoWorkAsync(); // Console.WriteLine(n1); //} for (int i = 0; i < 3; i++) { await RunInNewScopeAsync(async () => { var n1 = await DoWorkAsync(); Console.WriteLine(n1); }); } //for (int i = 0; i < 3; i++) //{ // await RunInNewScopeFunc(async () => // { // var n1 = await DoWorkAsync(); // Console.WriteLine(n1); // return n1; // }); //} Console.WriteLine("finished..."); Console.ReadLine(); } }
遍历场次,切换数据库执行逻辑,,截图是简单示例),发现action的缺点;综合对比,后续建议都用func.
其他示例:
class Program { static int i = 0; static async Task Main(string[] args) { for (int i = 0; i < 3; i++) { await RunInNewScopeAsync(async () => { var n1 = await DoWorkAsync(); Console.WriteLine(n1); }); } Console.WriteLine("finished..."); Console.ReadLine(); } static async Task RunInNewScopeAsync(Action action) { action(); } static async Task<string> DoWorkAsync() { await Task.Delay(1000); return "mxd " + i++; } }