Заменить метод синхронизации на асинхронный - PullRequest
0 голосов
/ 24 октября 2018

Как я могу сделать этот метод асинхронным?

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;
        }

Простое помещение async и await, похоже, не работает.Кроме того, как я могу сделать это 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 голосов
/ 24 октября 2018

Вы можете определить простой 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...
}

Есть и другие способы сделать это.Я бы посоветовал вам прочитать документацию Microsoft по Асинхронному программированию с асинхронным и await (C #) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...