Nhibernate CommitAsync 是否等待所有异步 CRUD 操作?
Does Nhibernate CommitAsync wait for all Async CRUD Operations?
我正在尝试弄清楚 nhibernate 中的 CommitAsync
方法如何与 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
每次调用之前发出使用同一会话的新呼叫。
换句话说,不要这样做:
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);
关于并行与异步的快速旁注。并行执行是异步执行的一个子集:每个并行执行都是异步的,但不是每个异步执行都是并行的。
异步执行某事对应于“不阻塞调用者”。可以通过立即开始这项工作来实现,这意味着它将并行完成,或者等待调用者完成他们的工作,这意味着工作将由同一个或另一个线程顺序执行。无论哪种方式,作业都不会阻塞调用者,因此我们可以说它将异步执行。
我正在尝试弄清楚 nhibernate 中的 CommitAsync
方法如何与 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
每次调用之前发出使用同一会话的新呼叫。
换句话说,不要这样做:
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);
关于并行与异步的快速旁注。并行执行是异步执行的一个子集:每个并行执行都是异步的,但不是每个异步执行都是并行的。
异步执行某事对应于“不阻塞调用者”。可以通过立即开始这项工作来实现,这意味着它将并行完成,或者等待调用者完成他们的工作,这意味着工作将由同一个或另一个线程顺序执行。无论哪种方式,作业都不会阻塞调用者,因此我们可以说它将异步执行。