用异步之一替换同步方法

时间:2018-10-24 02:58:26

标签: c# .net asp.net-mvc async-await

如何使该方法异步?

public List<ItemsList> GetAllItems()
        {
            List<ItemsList> items = new List<ItemsList>();
            string query= String.Format("SELECT MFPARTN, MFDSC, sum(QHAVL) as Total FROM IPMFF");
            newConnection.OpenConnection();
            command = new Command(Query, newConnection.ConnectionInstance);
            dataReader = command.ExecuteReader();
            ItemsList itemsList = null;
            while (dataReader.Read())
            {
                itemsList = new ItemsList();

                if (System.DBNull.Value != dataReader["MFPARTN"])
                {
                    itemsList.ItemNumber = (dataReader["MFPARTN"].ToString());
                }
                if (System.DBNull.Value != dataReader["MFDSC"])
                {
                    itemsList.ItemDescription = (dataReader["MFDSC"].ToString());
                }
                if (System.DBNull.Value != dataReader["Total"])
                {
                    itemsList.ItemQuantity = (Convert.ToInt32(dataReader["Total"]));
                }
                items.Add(itemsList);
            }
            return items;
        }

仅放置asyncawait似乎无效。另外,如何使它成为Task方法?我是异步方法的新手,所以。

  

更新

我已经修改了这种方法。

public Task<List<ItemsList>> GetAllItems()
            {
                List<ItemsList> items = new List<ItemsList>();
                string query= String.Format("SELECT MFPARTN, MFDSC, sum(QHAVL) as Total FROM IPMFF");
                newConnection.OpenConnection();
                command = new Command(Query, newConnection.ConnectionInstance);
                dataReader = command.ExecuteReader();
                ItemsList itemsList = null;
                while (await dataReader.ReadAsync())
                {
                    itemsList = new ItemsList();

                    if (System.DBNull.Value != dataReader["MFPARTN"])
                    {
                        itemsList.ItemNumber = (dataReader["MFPARTN"].ToString());
                    }
                    if (System.DBNull.Value != dataReader["MFDSC"])
                    {
                        itemsList.ItemDescription = (dataReader["MFDSC"].ToString());
                    }
                    if (System.DBNull.Value != dataReader["Total"])
                    {
                        itemsList.ItemQuantity = (Convert.ToInt32(dataReader["Total"]));
                    }
                    items.Add(itemsList);
                }
                return items;
            }

但是当我执行这段代码时,它将返回此错误。

  

传递到字典中的模型项是类型   'System.Threading.Tasks.Task System.Collections.Generic.List,但   这本字典需要类型的模型项   'System.Collections.Generic.IEnumerable`

1 个答案:

答案 0 :(得分:0)

您可以定义一个简单的Task<T>来处理GetAllItems函数,

public Task<List<ItemsList>> GetListOfItems(){
//Simply pass in your GetAllItems Method
return Task.Factory.StartNew(()=>GetAllItems());
}

您现在可以创建一个函数来处理异步操作,如下所示:

 public async void GetListOfItemsAsync(){
List<ItemsList> myItems=await GetListOfItems();
//Do something with your list...
}

还有其他方法可以做到这一点。我建议您阅读Asynchronous programming with async and await (C#)上的Microsoft文档。