C# MaxConcurrentCalls=0,但在本地使用azure服务总线时仍有工作线程

C# MaxConcurrentCalls=0,但在本地使用azure服务总线时仍有工作线程,c#,multithreading,azure,C#,Multithreading,Azure,我已设置azure服务总线队列。在host.json文件中,我将maxConcurrentCalls设置为1,但是当我在本地调试应用程序时,有8-10个工作线程在运行,这使得应用程序无法调试。当我在本地调试我的应用程序时,如何只运行1个线程 最初,我的host.json是空的,我发现下面的代码应该只有一个线程执行,请参见 我在local.json设置中添加了host.json设置,但没有效果,在启动时仍有10个工作线程启动。 我还尝试将函数调用设为singleton,请参见 然而,这只是完全锁定

我已设置azure服务总线队列。在host.json文件中,我将maxConcurrentCalls设置为1,但是当我在本地调试应用程序时,有8-10个工作线程在运行,这使得应用程序无法调试。当我在本地调试我的应用程序时,如何只运行1个线程

最初,我的host.json是空的,我发现下面的代码应该只有一个线程执行,请参见

我在local.json设置中添加了host.json设置,但没有效果,在启动时仍有10个工作线程启动。 我还尝试将函数调用设为singleton,请参见 然而,这只是完全锁定了功能,根本没有解决任何问题

   [FunctionName("ReadFromXCagoIssueQueueAndRetrieveFiles")]
    public static void Run([ServiceBusTrigger(QueueName, AccessRights.Manage, Connection = "SBConnection")]BrokeredMessage myQueueItem, TextWriter log)
    {
        log.WriteLine($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
        var propIssueId = myQueueItem.Properties["IssueId"].ToString();
        var issueId = int.Parse(propIssueId);
        log.WriteLine($"begin grab files for issue: {issueId}");
        retrieveIssueEPub(issueId);
    }

RetrieveIsSeepub的执行是在多个工作线程上执行的,这意味着在函数运行一次后,消息会在死信队列中结束,因为它会在所有线程中分割相同的消息,而不是我期望的最大并发调用的1个线程。我错过什么了吗?一次并发拉出一条消息和在多个线程上执行函数之间有什么区别吗?

我的一位同事发现了这个错误。 应用程序一次只触发一个线程。但是在azure上,锁定持续时间设置为30秒。 这意味着应用程序将在30秒后启动新线程,等等,因为消息将被解锁。
扩展锁解决了这个问题

这阻碍了生产,掩盖了这个问题。问题仍然存在,消息没有及时处理,或者代码忘记调用消息上的
Complete()
,将其从队列中删除。但是现在,您有一个更大的问题,在出现问题的情况下需要很长时间重试的消息服务总线应用程序应该同时为多个消息提供服务。在这方面,任何web应用程序都是如此。这并不会使它们更难调试。除非接收代码有缺陷,否则多个工作进程不会接收相同的消息。您在这里发布的代码有问题-它没有调用,因此消息在租约到期后再次出现在队列中。只要调用
Complete()
我不知道你的代码应该做什么。我所知道的是,当你收到一条消息时,你必须通过调用
Complete()
明确地说它已被接收,否则它将假定你的工作程序失败,消息将重新出现在队列中。这与使用数据库事务和忘记调用
COMMIT
没有什么不同。这就是所有排队系统的工作方式,除了AWS、Google Azure使用的分布式队列不锁定消息,而是在指定时间内隐藏消息。我已将host.json更改为autocomplete,但这不会改变锁定已到达且未刷新的问题。因此,如果消息自动完成,我仍然会出现多个线程?我理解,谢谢你的帮助
   [FunctionName("ReadFromXCagoIssueQueueAndRetrieveFiles")]
    public static void Run([ServiceBusTrigger(QueueName, AccessRights.Manage, Connection = "SBConnection")]BrokeredMessage myQueueItem, TextWriter log)
    {
        log.WriteLine($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
        var propIssueId = myQueueItem.Properties["IssueId"].ToString();
        var issueId = int.Parse(propIssueId);
        log.WriteLine($"begin grab files for issue: {issueId}");
        retrieveIssueEPub(issueId);
    }