首页 文章

填充数据集异步

提问于
浏览
0

以下方法用于填充数据集 .

如果我们以同步方式调用此方法,它工作正常 .

但是现在我们需要以异步方式调用此方法 . 所以我需要做哪些更改,以便下面的方法应该正常工作而不会出现任何问题 .

public DataSet Filldata(string ProcName,string TableName){DataSet ds = new DataSet(); try {da = new SqlDataAdapter(ProcName,con); if(con.State!= ConnectionState.Open){con.Open(); } da.SelectCommand.CommandTimeout = 15000; da.Fill(ds,TableName); } catch(Exception ex){ErrorMsg = ex.Message.ToString(); HMISLogger.logger.Error(ex.Message.ToString()“”ProcName,ex); } finally {con.Close(); da.Dispose(); } return ds; }

3 回答

  • 0

    可能你应该使用SqlDataReader而不是SqlDataAdabter,因为SqlDataReader具有Async功能

    请参阅以下链接以获取样本或更多信息

    https://msdn.microsoft.com/en-us/library/1a674khd(v=vs.110).aspx

  • 0

    你可以使用如下的东西,返回作为异步操作的Task

    public Task<DataSet> FilldataAsync(string ProcName, string TableName)
    {
        try
                {
                    return Task.Run(() =>
                    {
                        DataSet ds = new DataSet();
                        using (var da = new SqlDataAdapter(ProcName, con))
                        {
                            da.SelectCommand.CommandTimeout = 15000;
                            da.Fill(ds, TableName);
                            return ds;
                        }
                    });
                }
                catch (Exception ex)
                {
                    ErrorMsg = ex.Message.ToString();
                    HMISLogger.logger.Error(ex.Message.ToString() + " " + ProcName, ex);
                }
    }
    

    您可以使用async / await关键字将其称为以下

    private async Task GetSomeData(string sSQL)
    {
        DataSet results = await FilldataAsync(ProcName, TableName);
        //Populate once data received
        grdRes.DataSource = results.Tables[0];
    }
    
  • 0

    您可以声明类级静态对象,如下所示

    private static object lockObject = new object();
    

    并修改你的方法如下,As Fill方法负责连接打开和关闭我们可以在它之前添加lock语句 .

    public DataSet Filldata(string ProcName, string TableName)
            {
                DataSet ds = new DataSet();
                try
                {
    
                    da = new SqlDataAdapter(ProcName, con);
                    da.SelectCommand.CommandTimeout = 15000;
                    lock (lockObj)
                    {
                        da.Fill(ds, TableName);
                    }
                }            
                catch (Exception ex) {
                    ErrorMsg = ex.Message.ToString();
                    HMISLogger.logger.Error(ex.Message.ToString() + " " + ProcName, ex);
                }
                finally {
                    con.Close();
                    da.Dispose();
                }
                return ds;
            }
    

相关问题