为什么_session.Use方法不能正常工作?

问题描述 投票:0回答:1

我有这样的工作:

[UnitOfWork]
public override void Execute(CompleteIRHJobArgs args)
{
    var robotUserId = _userRepo.GetAll().Where(p => p.UserName == TestaLIMSWPConsts.LIMSRobot).Select(p => p.Id).First();

    using (_session.Use(args.TenantId, robotUserId))
    {
        _instanceReciptHeaderDomainService.SetIRHToCompleteState(args.IRHIds);
    }
}

我找到robotUserId并将其设置为当前用户。但是我进入方法SetIRHToCompleteState后,_session.UserId.Valuenull。我认为这是错误的行为。我的ABP版本是4.0.0。

public async Task SetIRHToCompleteState(List<int> irhIds)
{
    var irhs = await _instanceHeaderRepo.GetAll().Where(p => irhIds.Contains(p.Id)).ToListAsync();

    foreach (var t in irhs)
    {
        t.FlowState = FlowState.Completed;
        t.CompleteDate = Clock.Now;
        t.CompleteUserId = _session.UserId.Value;
    }
}

有时,

var irhs =等待_instanceHeaderRepo.GetAll()...

引发异常:

System.Transactions.TransactionInDoubtException:交易有疑问。 ---> System.Data.SqlClient.SqlException:已经存在与此Command关联的打开的DataReader,必须首先关闭它。 ---> System.ComponentModel.Win32Exception:等待操作超时

asp.net async-await aspnetboilerplate sqlexception using-statement
1个回答
1
投票

但是进入方法SetIRHToCompleteState后,_session.UserId.Value为空。

[SetIRHToCompleteStateasync,并且在处置了using范围之后继续运行。

由于Execute不是async,因此无法await,但可以调用AsyncHelper.RunSync

// using Abp.Threading;

using (_session.Use(args.TenantId, robotUserId))
{
    AsyncHelper.RunSync(() => _instanceReciptHeaderDomainService.SetIRHToCompleteState(args.IRHIds));
}

这还将避免“打开DataReader”错误。

来自aspnetboilerplate/aspnetboilerplate#1646

在后台线程中调用,该线程不在异步上下文中。但这不是问题,因为后台作业管理器已经是单线程的,并且不会导致阻塞许多线程。Hangfire的实现也是如此。

© www.soinside.com 2019 - 2024. All rights reserved.