gpt4 book ai didi

.net - Nhibernate CommitAsync 是否等待所有异步 CRUD 操作?

转载 作者:行者123 更新时间:2023-12-04 08:03:59 25 4
gpt4 key购买 nike

我想弄清楚 CommitAsync nhibernate 中的方法与 SaveAsync 一起工作, UpdateAsync , & DeleteAsync我的问题是:假设我调用 SaveAsync , 或 UpdateAsync多次没有等待他们。然后过了一段时间我调用 CommitAsync .威尔CommitAsync等待所有对 SaveAsync 的调用和 UpdateAsync完成?或者我必须在打电话之前等待他们CommitAsync ?
我创建了下面的测试并尝试保存多个用户而不等待他们然后尝试使用 CommitAsync 提交查看数据库中是否会丢失任何内容,或者计数是否会关闭但它似乎有效。但是,我在网上看到的每个示例都在提交之前等待所有异步 CRUD 操作。

[TestFixture]
public class AsyncTests
{
[Test]
public async Task TestAsync()
{
var sessionSource = new SessionSource();
int saveCount = 100000;
using (var session = sessionSource.CreateSession())
{
using (var t = session.BeginTransaction())
{
SaveMany(saveCount, session);
await t.CommitAsync();
}
}

int count = 0;
using (var sessoin = sessionSource.CreateSession())
{
count = sessoin.Query<User>().Count();
}

Assert.That(count, Is.EqualTo(saveCount));
}

public void SaveMany(int count, ISession session)
{
for (var i = 0; i < count; i++)
{
Save(session);
}
}

private Task<object> Save(ISession session)
{
return session.SaveAsync(new User()
{
Guid = Guid.NewGuid(),
FirstName = "saveasync",
MiddleName = "middle",
LastName = "last"
});
}
}

最佳答案

基于这篇文章:NHibernate 5: async IO bound operations support
你应该等待所有 async方法。
这里我复制相关部分:
请注意,此功能不适用于并行性,仅适用于 非并行异步 ,所以一定要await在使用相同 session 发出新调用之前的每个调用。
换句话说,不要这样做:

Task<Customer> task1 = session.GetAsync<Customer>(1);
Task<Customer> task2 = session.GetAsync<Customer>(2);

Customer[] customers = await Task.WhenAll(task1, task2);
改为这样做:
Customer customer1 = await session.GetAsync<Customer>(1);
Customer customer2 = await session.GetAsync<Customer>(2);
关于并行与异步的简要说明。并行执行是异步执行的一个子集:每个并行执行都是异步的,但并非每个异步执行都是并行的。
异步执行某事对应于“不阻塞调用者”。它可以通过立即开始这项工作来实现,这意味着它将并行完成,或者等待调用者完成他们的工作,这意味着工作将按顺序执行,由同一个线程或另一个线程执行。无论哪种方式,作业都不会阻塞调用者,因此我们可以说它将异步执行。

关于.net - Nhibernate CommitAsync 是否等待所有异步 CRUD 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66314653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com