了解与odbc有关的异步方法

时间:2019-04-09 07:57:06

标签: c#

我有一个使用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;
        }
    }           

1 个答案:

答案 0 :(得分:0)

如果ReadAsync并非真正异步,则需要使用单独的线程。

最简单的方法是将整个方法调用放入Task中:

decimal d = await Task.Run(() => GetFreeStockFromSage(myProductCode));

使GetFreeStockFromSage()异步也是一种选择,但是如果ReadAsync不是真正的异步,那将不是完美的。您需要将async方法用于任何受IO限制的方法,例如SqlConnection.OpenAsync()SqlCommand.ExecuteReaderAsync()(假设这些方法实际上是异步的)。然后,您需要将while(reader.Read())循环移动到其自己的任务中,以免阻塞UI线程。