Как поддерживать асинхронные методы в TransactionScope с помощью Microsoft.Bcl.Async в .NET 4.0?
У меня есть метод, похожий на:
public async Task SaveItemsAsync(IEnumerable<MyItem> items)
{
using (var ts = new TransactionScope())
{
foreach (var item in items)
{
await _repository.SaveItemAsync(item);
}
await _repository.DoSomethingElse();
ts.Complete();
}
}
Это, конечно, имеет проблемы, потому чтоTransactionScope
не работает с async / await.
Это не сInvalidOperationException
с сообщением:
«TransactionScope должен быть расположен в том же потоке, в котором он был создан».
Я читаю оTransactionScopeAsyncFlowOption
вэтот ответКажется, это именно то, что мне нужно.
Тем не менее, для этого конкретного проекта у меня есть жесткое требование для поддержки .Net 4.0 и я не могу обновить до 4.5 или 4.5.1. Таким образом, асинхронное / ожидающее поведение в моем проекте обеспечиваетсяПакет Microsoft.Bcl.Async NuGet.
Не могу найтиTransactionScopeAsyncFlowOption
в этом или любом другомПакет OOB, Я просто где-то скучаю?
Если он недоступен, есть ли альтернатива для достижения того же результата? То есть - я бы хотел, чтобы область транзакции была правильно завершена или откатана, несмотря на пересечение потоков с продолжениями.
я добавилDoSomethingElse
в приведенном выше примере, чтобы проиллюстрировать, что в пределах объема транзакции может быть несколько вызовов, поэтому просто передача всех элементов в базу данных за один вызов не является жизнеспособным вариантом.
В случае, если это имеет значение, хранилище использует прямой ADO.Net (SqlConnection
, SqlCommand
и т. д.) для записи на SQL Server.
ОБНОВИТЬ
Я думал, что у меня есть решение, которое заключается в том, чтобы взять System.Transactions.dll из .Net 4.5.1 и включить его в мой проект. Однако я обнаружил, что это работает только на моем устройстве dev, поскольку на нем уже установлена 4.5.1. Он не работал при развертывании на машине только с .Net 4.0. Это просто далоMissingMethodException
, Я ищу решение, которое будет работать на установке .Net 4.0.