-->

c# async/await 前后线程的问题

2019-09-11 16:58发布

问题:

自定义异步方法:

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);//真异步
}