异步方法线程安全吗?

时间:2015-05-30 16:10:24

标签: c# .net multithreading asynchronous async-await

假设我有一个使用数据库的应用程序。每当此应用程序启动时,它会将数据库备份到某个位置。而这个备份过程需要花费太多时间。

为了使gui响应,我会使用异步等待。像这样;

public async Task BackupDataBase(){

   using(SqlCommand command = new SqlCommand(@"BACKUP DATABASE [MyDatabase] TO  DISK = 'C:\....\MyDatabase.bak'"), connection)
   {
       await command.ExecuteNonQueryAsync();
   }

}

我的问题是;我的应用程序可以使用相同的连接来查询其他一些东西,而无需锁定吗?或者我应该在异步方法工作时锁定连接吗?

1 个答案:

答案 0 :(得分:0)

即使您新建了SqlConnection,您实际上也是在SqlConnection类内部维护的连接池中请求可能存在的实例。

一般来说,它不会被阻止。您可以将最大池大小限制为一,但这很可能会导致您的大多数应用程序变得非常无响应,并且在Web应用程序中会自杀。

考虑到sql语句的性质,sql服务器通常很擅长保持适当的锁,我的​​猜测是你的代码可以工作。

从您的应用程序中进行备份可能有点不同寻常,如果您将应用程序水平扩展到多个Web服务器,它将变得一团糟。

那么sql server上的预定任务怎么样?