我异步调用 NHibernate 的方法有什么问题吗?
Is there anything wrong with my method for calling NHibernate in async?
我正在尝试使用 NHibernate 实现 Identity 的 IUserStore<TUser, in TKey>
,它缺少 IUserStore
所需的异步方法。这是我无知地尝试分派阻塞调用并使方法异步:
public class QsaasUserStore<TLogin> : IUserStore<QsaasUser<TLogin>, int> where TLogin : QsaasUserLogin<int>
{
public Task CreateAsync(QsaasUser<TLogin> user)
{
var session = NHibertnateSessionProvidser.SessionFactory.GetCurrentSession();
return Task.Factory.StartNew(() => session.Save(user))
.ContinueWith(ex => Trace.TraceError(ex?.Exception?.Message ?? "Strange task fault"), TaskContinuationOptions.OnlyOnFaulted);
}
}
我从一些初步的谷歌搜索中收集了以上内容,对我来说似乎没问题,但我认为我可以通过异常处理做得更好。
NHibernate 会话不是线程安全的。
您正在一个线程上检索会话,然后在另一个线程上调用 Save
。这可能行得通,甚至大部分时间都行得通,但你在 'undefined behavior' 领域。
您正在实现的接口需要您return 一项任务。您可以在不涉及后台线程的情况下实现此约束。
public class QsaasUserStore<TLogin> : IUserStore<QsaasUser<TLogin>, int> where TLogin : QsaasUserLogin<int>
{
public Task CreateAsync(QsaasUser<TLogin> user)
{
var session = NHibertnateSessionProvidser.SessionFactory.GetCurrentSession();
session.Save(user);
return Task.FromResult(0);
}
}
如果您真的想在工作线程上 运行 它,则使用后台线程来检索会话并调用 Save
。这只有在您的 SessionFactory
足够聪明,可以将不同的会话映射到不同的线程时才有效。
public Task CreateAsync(QsaasUser<TLogin> user)
{
return Task.Factory.StartNew(() => {
var session = NHibertnateSessionProvidser.SessionFactory.GetCurrentSession();
session.Save(user);
}).ContinueWith(ex => Trace.TraceError(ex?.Exception?.Message ?? "Strange task fault"), TaskContinuationOptions.OnlyOnFaulted);
}
我正在尝试使用 NHibernate 实现 Identity 的 IUserStore<TUser, in TKey>
,它缺少 IUserStore
所需的异步方法。这是我无知地尝试分派阻塞调用并使方法异步:
public class QsaasUserStore<TLogin> : IUserStore<QsaasUser<TLogin>, int> where TLogin : QsaasUserLogin<int>
{
public Task CreateAsync(QsaasUser<TLogin> user)
{
var session = NHibertnateSessionProvidser.SessionFactory.GetCurrentSession();
return Task.Factory.StartNew(() => session.Save(user))
.ContinueWith(ex => Trace.TraceError(ex?.Exception?.Message ?? "Strange task fault"), TaskContinuationOptions.OnlyOnFaulted);
}
}
我从一些初步的谷歌搜索中收集了以上内容,对我来说似乎没问题,但我认为我可以通过异常处理做得更好。
NHibernate 会话不是线程安全的。
您正在一个线程上检索会话,然后在另一个线程上调用 Save
。这可能行得通,甚至大部分时间都行得通,但你在 'undefined behavior' 领域。
您正在实现的接口需要您return 一项任务。您可以在不涉及后台线程的情况下实现此约束。
public class QsaasUserStore<TLogin> : IUserStore<QsaasUser<TLogin>, int> where TLogin : QsaasUserLogin<int>
{
public Task CreateAsync(QsaasUser<TLogin> user)
{
var session = NHibertnateSessionProvidser.SessionFactory.GetCurrentSession();
session.Save(user);
return Task.FromResult(0);
}
}
如果您真的想在工作线程上 运行 它,则使用后台线程来检索会话并调用 Save
。这只有在您的 SessionFactory
足够聪明,可以将不同的会话映射到不同的线程时才有效。
public Task CreateAsync(QsaasUser<TLogin> user)
{
return Task.Factory.StartNew(() => {
var session = NHibertnateSessionProvidser.SessionFactory.GetCurrentSession();
session.Save(user);
}).ContinueWith(ex => Trace.TraceError(ex?.Exception?.Message ?? "Strange task fault"), TaskContinuationOptions.OnlyOnFaulted);
}