Вставить массовые данные в фоновом режиме в. Net Core - PullRequest
3 голосов
/ 16 июня 2020

Я использую. Net Core 3.1, и я хочу вставить массив данных в фоновом режиме, поэтому мне не нужен мой HTTP-запрос, ожидающий его «как огонь и забыл»

Итак, я попробовал следующий код

public object myFunction(){
    Task.Factor.StartNew(() => {
        _context.BulkInsertAsync(logs);
    });

    return data;
}

Но ничего не случилось, данные, сохраненные в базе данных, после того, как мои данные вернули мой _context, и журналы будут нулевыми, поэтому процесс зарегистрирован? или есть другой способ вставить мои данные и не ждать их

Примечание: фоновая задача работает, если я заменяю статус вставки на отправку почты или что-то еще

Решено :

Спасибо @Peter, я решил это с помощью

Task.Run(async () => await _context.BulkInsertAsync(logs));

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Task.Factory.StartNew или TaskFactory.StartNew не могут принимать делегаты asyn c (Func<Task>), поэтому вы должны использовать вместо него Task.Run, который действительно имеет перегрузку с Fun c . Вам нужно будет использовать await await или Unwrap вместо StartNew, чтобы получить такое же поведение, как и с Run. Прочтите, пожалуйста, отличную запись в блоге Стивена Туба .

public object myFunction(){
    Task.Run(async () => await _context.BulkInsertAsync(logs));
    return data;
}
1 голос
/ 16 июня 2020

Вот как бы я это реализовал. Это предполагает, что ответ не важен.

public NotImportantResult ProcessBulkData()
{
    myFunctionAsync();
    return new NotImportantResult() 
}  

private static async void myFunctionAsync()
{
    await Task.Factory.StartNew(() => new MyBulkProccessor.BulkInsertAsync(logs));
}
...