从try/catch块返回产量

Gro*_*roo 7 c# transactions idisposable yield-return try-catch-finally

正如Eric Lippert在本文中所描述的那样,yield return不允许在try/catch条款内.

有没有一种很好的方式我可以得到这样的东西,而不必IEnumerator手工编写我自己的东西:

public IEnumerable<Data> GetData()
{
    var transaction = Session.BeginTransaction());
    try 
    {
        IQuery q = CreateQuery(session);

        foreach (var result in q.Enumerable())
            yield return ProjectResult(result);  // <-- doesn't work

        session.Commit();
    }
    catch (Exception ex)
    {
        transaction.Rollback();
        throw;
    }
    finally
    {
        transaction.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 11

我只是改变这样的事务处理逻辑:

public IEnumerable<Data> GetData()
{
    var transaction = Session.BeginTransaction();
    bool rollback = true;
    try 
    {
        IQuery q = CreateQuery(session);

        foreach (var result in q.Enumerable())
        {
            yield return ProjectResult(result);
        }

        rollback = false;
        session.Commit();
    }
    finally
    {
        if (rollback)
        {
            transaction.Rollback();
        }
        transaction.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您的事务支持"dispose意味着回滚,除非它被提交"的想法:

public IEnumerable<Data> GetData()
{
    using (var transaction = Session.BeginTransaction();
    {
        IQuery q = CreateQuery(session);

        foreach (var result in q.Enumerable())
        {
            yield return ProjectResult(result);
        }

        // Commits the tnrasaction, so disposing it won't roll it back.
        session.Commit();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Stripling,这不是*try/catch*. (7认同)
  • @StriplingWarrior:只是为了扩展Anthony的评论:在try/finally中允许yield return,而不是在try/catch中. (2认同)