1

データベースにいくつかの行を挿入する必要があり、行にエラーが含まれている場合は、すべての変更をロールバックする必要があります。Parallelクラスを使うことを考えていました。これが私のコードです

class Program
{
static void Main(string[] args)
{
    List<string> results = new List<string>();
    string[] lines = File.ReadAllLines("d:\\opers2.txt");

    using (TransactionScope trans = new TransactionScope())
    {
        System.Threading.Tasks.Parallel.For(0, lines.Count(), i =>
            {
                string[] parts = lines[i].Split('\t');
                string answer = LoadOper(parts[9], parts[7], parts[0]);

                if (!string.IsNullOrEmpty(answer))
                    results.Add(answer);
            });

        //trans.Complete();
    }
}

static string LoadOper(string typeName, string summ, string operDate)
{
    System.Transactions.Transaction trans = System.Transactions.Transaction.Current;
    string answer = trans == null ? "NULL" : "TRANSACTION";
    using (OperEntities context = new OperEntities())
    {
        try
        {
            DateTime dt = DateTime.Parse(operDate);
            decimal summa = Decimal.Parse(summ);
            OperationType type = context.OperationTypes.FirstOrDefault(t => t.name == typeName);

            Operation oper = new Operation()
            {
                dt_oper = dt,
                summ = summa,
                OperationType = type
            };

            context.Operations.AddObject(oper);
            context.SaveChanges();
        }
        catch (Exception ex)
        {
            return answer + " " + ex.Message;
        }
    }
    return answer;
}
}

ただし、一部のスレッドでは、LoadOper関数にTransaction.Current=nullがあります。

なんで?

4

0 に答える 0