Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

TransactionScope内でawaitによる非同期メソッドの呼び出しとか

TransactionScope内で、await使ったりすると、「TransactionScope は、作成されたスレッド上で破棄される必要があります。」 的な例外が発生します。

    using (var ctx = new NorthWindEntities())
    {
        using (var ts = new TransactionScope())
        {
            ctx.Employees.Add(new Employee()
            {
                LastName = "Nippon",
                FirstName = "Taro",
            });

            await Task.Delay(1000); // 例として

            ctx.SaveChanges();
        }
    }

しかし、.NET 4.5.1からは、TransactionScopeAsyncFlowOptionオプションを使うと無問題になります。

 using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))

TransactionScopeを使うかどうかは別問題として。