C# Masstransit IRequestClient。来自Quartz作业死锁的请求调用

C# Masstransit IRequestClient。来自Quartz作业死锁的请求调用,c#,asp.net,quartz.net,masstransit,C#,Asp.net,Quartz.net,Masstransit,我有一个通过Masstransit IRequestClient.Request方法调用业务服务的报告 如果此报表是从UI(ASP.NET MVC控制器)生成的,则一切正常,但如果从Quartz.NET作业方法生成相同的报表,则永远不会返回调用 下面是代码示例: //client is an instance of MessageRequestClient class var response = await client.Request(new GetEntityCommand

我有一个通过Masstransit IRequestClient.Request方法调用业务服务的报告

如果此报表是从UI(ASP.NET MVC控制器)生成的,则一切正常,但如果从Quartz.NET作业方法生成相同的报表,则永远不会返回调用

下面是代码示例:

//client is an instance of MessageRequestClient class
var response = await client.Request(new GetEntityCommand
        {
            Ids = ids,
            ExcludeDeleted = excludeDeleted
        }).ConfigureAwait(false);
消费者代码:

public class GetEntityCommandConsumer : IConsumer<IGetEntityCommand>
{
    private readonly IEntityService _entityService;

    public GetEntityCommandConsumer(IEntityService entityService)
    {
        _entityService= entityService;
    }

    public Task Consume(ConsumeContext<IGetEntityCommand> context)
    {
        var ids = context.Message.Ids;
        var entities = _entityService.GetAll(ids, context.Message.ExcludeDeleted); //database NHibernate call
        var result =
            context.RespondAsync(new GetEntityCommandResponse
            {
                Success = true,
                Entities = entities.Select(x => x.ToDTO).ToList()
            });

        return result;
    }
}
公共类GetEntityCommandConsumer:IConsumer
{
私有只读客户端服务实体服务;
公共GetEntityCommandConsumer(entityService entityService)
{
_entityService=entityService;
}
公共任务消费(消费上下文)
{
var id=context.Message.ids;
var entities=\u entityService.GetAll(id,context.Message.excludedeled);//数据库NHibernate调用
var结果=
RespondAsync(新GetEntityCommandResponse
{
成功=正确,
Entities=Entities.Select(x=>x.ToDTO.ToList())
});
返回结果;
}
}

似乎没有等待使用者调用,并且作用域在完成之前已被释放,因此会出现死锁

试试这个:

public async Task Consume(ConsumeContext<IGetEntityCommand> context)
{
    var ids = context.Message.Ids;
    var entities = _entityService.GetAll(ids, context.Message.ExcludeDeleted); //database NHibernate call
    await
        context.RespondAsync(new GetEntityCommandResponse
        {
            Success = true,
            Entities = entities.Select(x => x.ToDTO).ToList()
        });
}
公共异步任务使用(consumercontext)
{
var id=context.Message.ids;
var entities=\u entityService.GetAll(id,context.Message.excludedeled);//数据库NHibernate调用
等待
RespondAsync(新GetEntityCommandResponse
{
成功=正确,
Entities=Entities.Select(x=>x.ToDTO.ToList())
});
}

似乎没有等待使用者调用,并且作用域在完成之前已被释放,因此会出现死锁

试试这个:

public async Task Consume(ConsumeContext<IGetEntityCommand> context)
{
    var ids = context.Message.Ids;
    var entities = _entityService.GetAll(ids, context.Message.ExcludeDeleted); //database NHibernate call
    await
        context.RespondAsync(new GetEntityCommandResponse
        {
            Success = true,
            Entities = entities.Select(x => x.ToDTO).ToList()
        });
}
公共异步任务使用(consumercontext)
{
var id=context.Message.ids;
var entities=\u entityService.GetAll(id,context.Message.excludedeled);//数据库NHibernate调用
等待
RespondAsync(新GetEntityCommandResponse
{
成功=正确,
Entities=Entities.Select(x=>x.ToDTO.ToList())
});
}

像往常一样,问题出在我自己的代码中:)IBusControl有两个实例,但预期只有一个。未启动作业中使用的IBusControl。通过使用“true”单音IBusControl进行修复。

与往常一样,问题出现在我自己的代码中:)IBusControl有两个实例,但预期只有一个。未启动作业中使用的IBusControl。通过使用“true”单音IBusControl进行修复。

最好也能看到消费者代码。将消费者代码添加到根消息中。使用者代码驻留在控制台应用程序中。调试器显示已调用使用者。似乎MT需要一些线程来返回任务结果,但它被其他代码阻止。您是否尝试过使consume方法异步,而不是返回任务,而是调用
await context.RespondAsync(…)
?我不确定石英在使用者中的位置。不,我没有尝试调用
await context.RespondAsync()
。Quartz不在使用者端,它在ASP.NET MVC应用程序端,它调用
等待客户端。请求(…)
也很乐意看到使用者代码。将使用者代码添加到根消息中。使用者代码驻留在控制台应用程序中。调试器显示已调用使用者。似乎MT需要一些线程来返回任务结果,但它被其他代码阻止。您是否尝试过使consume方法异步,而不是返回任务,而是调用
await context.RespondAsync(…)
?我不确定石英在使用者中的位置。不,我没有尝试调用
await context.RespondAsync()
。Quartz不在用户端,而是在ASP.NET MVC应用程序端,它调用
wait client.Request(…)
仍处于死锁状态。请注意,消息使用者在单独的进程中。我认为消费者没问题,IRequestClient中的线程有问题,它是从job使用的。我不这么认为。我们从未遇到过与
IRequestClient
有关的问题。它可以是调用请求客户端的代码。我将尝试使该方法同步并调用
TaskUtil.Await(()=>client.Request(…)仍处于死锁状态。请注意,消息使用者在单独的进程中。我认为消费者没问题,IRequestClient中的线程有问题,它是从job使用的。我不这么认为。我们从未遇到过与
IRequestClient
有关的问题。它可以是调用请求客户端的代码。我将尝试使该方法同步并调用
TaskUtil.Await(()=>client.Request(…)