C# 我在异步中调用NHibernate的方法有什么问题吗?
我正试图用NHibernate实现Identity的C# 我在异步中调用NHibernate的方法有什么问题吗?,c#,asynchronous,nhibernate,asp.net-identity,C#,Asynchronous,Nhibernate,Asp.net Identity,我正试图用NHibernate实现Identity的IUserStore,它缺少IUserStore所需的异步方法。这是我试图调度阻塞调用并使方法异步的无知尝试: public class QsaasUserStore<TLogin> : IUserStore<QsaasUser<TLogin>, int> where TLogin : QsaasUserLogin<int> { public Task CreateAsync(QsaasU
IUserStore
,它缺少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);
}
}
公共类QsaasUserStore:IUserStore,其中TLogin:QsaasUserLogin
{
公共任务CreateAAsync(QsaasUser用户)
{
var session=NHibertnateSessionProvidser.SessionFactory.GetCurrentSession();
返回Task.Factory.StartNew(()=>session.Save(用户))
.ContinueWith(ex=>Trace.TraceError(ex?.Exception?.Message?“奇怪的任务错误”)、TaskContinuationOptions.OnlyOnFaulted);
}
}
我从最初的谷歌搜索中收集到了上述信息,对我来说似乎还可以,但我认为我可以通过异常处理做得更好。NHibernate会话不是线程安全的 您正在一个线程上检索会话,然后在另一个线程上调用
Save
。这可能有效,甚至可能在大多数情况下有效,但您处于“未定义行为”区域
您正在实现的接口要求您返回一个任务。您可以在不涉及后台线程的情况下实现此约束
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);
}
}
我想我喜欢你的第二个建议。会话是按请求打开和关闭的,所以我认为这不是问题。
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);
}