我有一个使用ODBC来获取与数据库有关的数据的方法,但是我需要将方法更改为异步,以便它不会冻结表单,但仍会加载数据,我看到有一个ODBC阅读器上的ReadAsync方法,但是如何使用它。
public decimal GetFreeStockFromSage(string productCode)
{
string sageDsn = ConfigurationManager.AppSettings["SageDSN"];
string sageUsername = ConfigurationManager.AppSettings["SageUsername"];
string sagePassword = ConfigurationManager.AppSettings["SagePassword"];
decimal retDecimal =(decimal) 0.00;
//using (var connection = new OdbcConnection("DSN=SageLine50v24;Uid=Manager;Pwd=;"))
using (var connection = new OdbcConnection(String.Format("DSN={0};Uid={1};Pwd={2};", sageDsn, sageUsername, sagePassword)))
{
string sql = string.Format("SELECT 'STOCK_CODE' ,'Description',QTY_IN_STOCK - QTY_ALLOCATED AS 'FreeStock' FROM 'STOCK' where STOCK_CODE = '{0}'", productCode);
using (var command = new OdbcCommand(sql, connection))
{
connection.Open();
using (var reader = command.ExecuteReader())
{
while (reader.ReadAsync())
{
retDecimal = Convert.ToDecimal(reader["FreeStock"]);
}
}
}
return retDecimal;
}
}
答案 0 :(得分:0)
如果ReadAsync
并非真正异步,则需要使用单独的线程。
最简单的方法是将整个方法调用放入Task
中:
decimal d = await Task.Run(() => GetFreeStockFromSage(myProductCode));
使GetFreeStockFromSage()
异步也是一种选择,但是如果ReadAsync
不是真正的异步,那将不是完美的。您需要将async
方法用于任何受IO限制的方法,例如SqlConnection.OpenAsync()
或SqlCommand.ExecuteReaderAsync()
(假设这些方法实际上是异步的)。然后,您需要将while(reader.Read())
循环移动到其自己的任务中,以免阻塞UI线程。