Должны ли мы ожидать эту строку кода, поскольку здесь мы не обращаемся к базе данных?

#c# #asynchronous #async-await #entity-framework-core

#c# #асинхронный #async-await #entity-framework-core

Вопрос:

Мое требование — проверить, добавлен ли объект ContactType в объект dbcontext перед проверкой в БД.Я сделал это с помощью метода ChangeTracker . У меня есть вопрос относительно использования await для этого.
Q1. Поскольку мы не обращаемся к базе данных, нужно ли нам ожидать этого, поскольку эта запись добавляется к объекту в памяти (т.Е. dbcontext), и мы проверяем это.

  

    public async Task<ContactType> GetOrCreateContactType(string contactTypeName)
                {
                    if (string.IsNullOrWhiteSpace(contactTypeName))
                    {
                        return null;
                    }
                    ContactType contactType;
                    contactType = _dbContext.ChangeTracker.Entries()
                                                       .Where(x => x.State == EntityState.Added amp;amp; x.Entity is ContactType)
                                                       .Select(x => x.Entity as ContactType)
                                                       .FirstOrDefault(t => t.Name.ToUpper() == contactTypeName.ToUpper());
                    if (contactType != null)
                    {
                        return contactType;
                    }
                    else
                    {
                        contactType = await _dbContext.ContactTypes.SingleOrDefaultAsync(x => x.Name.ToUpper() == contactTypeName.ToUpper());
                        if (contactType != null)
                        {
                            return contactType;
                        }
                    }
                    //create if ContactType does not exists:
                    contactType = new ContactType()
                    {
                        Name = contactTypeName
                    };
                    _dbContext.ContactTypes.Add(contactType);
                    return contactType;
                }

  

ИЛИ ЭТО

 public async Task<ContactType> GetOrCreateContactType(string contactTypeName)
        {
            if (string.IsNullOrWhiteSpace(contactTypeName))
            {
                return null;
            }
            ContactType contactType=null;
             await Task.Run(() =>
            {
                contactType = _dbContext.ChangeTracker.Entries()
                                                 .Where(x => x.State == EntityState.Added amp;amp; x.Entity is ContactType)
                                                 .Select(x => x.Entity as ContactType)
                                                 .FirstOrDefault(t => t.Name.ToUpper() == contactTypeName.ToUpper());
            });
            if (contactType != null)
            {
                return contactType;
            }
            else
            {
                contactType = await _dbContext.ContactTypes.SingleOrDefaultAsync(x => x.Name.ToUpper() == contactTypeName.ToUpper());
                if (contactType != null)
                {
                    return contactType;
                }
            }
            //create if ContactType does not exists:
            contactType = new ContactType()
            {
                Name = contactTypeName
            };
            _dbContext.ContactTypes.Add(contactType);
            return contactType;
        }
  

Комментарии:

1. Итак, единственное различие — это Task.Run и await перед ним?

2. ДА. В этом разница.

3. Почему вы хотите запустить этот код в пуле потоков?

4. Используйте первый пример кода.