Лучший способ использования async / await в EntityframeworkCore - PullRequest
0 голосов
/ 14 июля 2020

для использования async / await в entityframeworkcore я использую этот способ, я хочу знать, верен ли мой метод или нет? Есть ли способ лучше?

public async Task<T> Create(T entity)
        {
            using (var db = new myDbContext())
            {
                var created = await db.Set<T>().AddAsync(entity);
                await db.SaveChangesAsync();
                return created.Entity;
            }
        }

public async Task<IEnumerable<T>> GetAll()
        {
            using (var db = new myDbContext())
            {
                var items = await db.Set<T>().ToListAsync();
                return items;
            }
        }

и для использования этого метода:

IDataService<Stock> Data = new GenericDataService<Stock>();

            Data.Create(new Stock { id = 2, name = "ok" }).Wait();
            foreach (var item in Data.GetAll().Result)
            {
                MessageBox.Show(item.name);
            }
            

1 Ответ

1 голос
/ 14 июля 2020

Избегайте syn c -over-asyn c .Result для незавершенного Task, потому что это ерунда в асинхронном программировании . Это может вызвать взаимоблокировки и сделать природу async бесполезной.

В случае синхронного метода вызывающего вы можете, по крайней мере, сделать это

IProgress<string> status = new Progress<string>(s => MessageBox.Show(s));

Task.Run(async () =>
{
    Stock entity = await Data.Create(new Stock { id = 2, name = "ok" });
    foreach (var item in await Data.GetAll())
    {
        status.Report(item.name);
    }
});

Progress здесь просто выполняет обратный вызов в Поток пользовательского интерфейса. Избегайте обновления пользовательского интерфейса из потоков пула.

Но это не единственный способ решить эту проблему.

Если вы находитесь в обработчике событий, просто сделайте его async и просто используйте await inline без Task.Run() и обратного вызова.

Также предлагаю переименовать методы в CreateAsync и GetAllAsync.

...