问题:
自定义异步方法:
public static async Task TransactionTestAsync() { Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId); int res = await AsyncTest(); //自定义的异步方法 Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId); } public static async Task<int> AsyncTest() { return await Task.Run(() => { return 1; }); }
打印出来的线程前后基本是不一致的
下面使用dapper的异步方法:
public static async Task TransactionTestAsync() { Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId); string sql1 = "INSERT INTO `person` (`Name`, `Sex`, `Age`) VALUES ('test', '1', '25');select @@IDENTITY;"; int res = await MySqlHelper.ExecuteScalarAsync<int>(sql1); //调用Dapper里面的异步方法 Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId); }
重复运行上面代码,当使用dapper的异步方法时打印出来的线程ID总是一样
按照我的理解来说使用await后面的代码都相当于是回调,那么应该使用与主线程不一样的线程,也就是前后线程不一致,那么像dapper提供的异步方法是怎么实现现在与主线程一样的呢?
回答1:
MySqlHelper.ExecuteScalarAsync
方法中要加上 async/await
回答2:
前后是否同一线程取决于Async方法内部。
通常来说,调用真正的异步,方法的前后线程是不一样的。
但是,有些情况下,异步是假的。比如
public static async Task<int> AsyncTest(int x)
{
if (x == 0) return 0; // 假异步,同步执行
if (x == 1) return await Task.FromResult<int>(0);//假异步,同步执行
return await Task.Run(() => x);//真异步
}