微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

返回一个 Func<Task> 中间的 Using 块

如何解决返回一个 Func<Task> 中间的 Using 块

我想返回一个 using 块的 Func 中间。在用户运行结果 Func 之前,我应该担心处理吗?

示例代码

private IDbContextTransaction _transaction;

public Func<Task> BeginTransaction()
{
    Task lockdispose = CommitTransaction();
    using (_transaction = _dbContext.Database.BeginTransaction())
    {
        return async() =>
        {
            await lockdispose;
        };
        Task.WaitAll(lockdispose); //This code is unreachable.
    }
}

private async Task CommitTransaction()
{
    _transaction.Commit();
    await Task.CompletedTask;
}

注意结果 Func 的执行时间由该服务的用户决定。

我检查了 This Question,这不是我的答案。

解决方法

既然您希望您的用户能够使用调用 for test_string in collection_of_strings: match = re.match(RE_myregex,test_string) if not match: # regex did not match at all continue # jump to top of loop to try next string a,b = match.groups() # unpack match groups if len(b) >= len(a): # must be fewer B than A continue # work with a and b BeginTransaction 之间的连接,那么您唯一能做的就是将处理移到此范围之外:

CommitTransaction

然后在外面的某个地方你需要做一些类似的事情:

private IDbContextTransaction _transaction;

public Func<Task> BeginTransaction()
{
    _transaction = _dbContext.Database.BeginTransaction()
    return CommitTransaction;
}

private async Task CommitTransaction()
{
    _transaction.Commit();
    _transaction.Dispose();
    await Task.CompletedTask;
}

// I advice you implement IDisposable fully,but 
// this will do for the sake of demonstration
public void Dispose()
{
    _transaction?.Dispose();
}

using (var obj = TheWayYouInitializeYourObject())
{
    var commit = obj.BeginTransaction();
    // DO WORK
    await commit();
}

基本上,您的 try { var commit = obj.BeginTransaction(); // DO WORK await commit(); } finally { obj.Dispose(); } 无法跨越用户工作的间隙,因此他们必须自己完成。

将必须与一次性用品一起使用的物品制作成一次性用品通常是个好主意。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。