C# 我在异步中调用NHibernate的方法有什么问题吗?

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

我正试图用NHibernate实现Identity的
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);
    }