C# ServiceStack post Deadlock - PullRequest
       28

C# ServiceStack post Deadlock

0 голосов
/ 01 февраля 2020

Я вызываю API много раз в секунду. Это вызывает тупики. Кто-нибудь может предложить решение этой проблемы? Я использую сервис .netcore 2.2 MVC

   public async Task Post(DeviceEndpointInsertTemp request)
        {
            //Check if device exists
            var q = Db.From<Device>(Db.TableAlias("d"))
                  .LeftJoin<Company>((device, company) =>
                      device.CompanyId == company.Id, Db.TableAlias("Company"))
                  .Where<Device>(d => Sql.TableAlias(d.DeviceNumber, "d") == request.DeviceNumber)
                  .Select<IntegrationDeviceCompany>(d => new
                  {
                      Id = Sql.TableAlias(d.Id, "d"),
                      CompanyId = Sql.TableAlias(d.CompanyId, "d"),
                      ModelCode = Sql.TableAlias(d.ModelCode, "d"),
                      DataUpdateTime = Sql.TableAlias(d.DataUpdateTime, "Company")
                  });
            var result = await Db.SingleAsync<IntegrationDeviceCompany>(q);
            if (result != null)
            {
                DeviceUpdateTemp deviceUpdateTemp = new DeviceUpdateTemp();
                deviceUpdateTemp.EventType = "device-update";
                deviceUpdateTemp.CompanyId = result.CompanyId;
                deviceUpdateTemp.DeviceId = result.Id;
                deviceUpdateTemp.DeviceNumber = request.DeviceNumber;
                deviceUpdateTemp.AuditId = 0;
                deviceUpdateTemp.AuditStamp = request.EventGridPostDateTime;
                deviceUpdateTemp.PickDateTime = DateTime.UtcNow.AddSeconds(result.DataUpdateTime);

                //get endpoints by device id
                var iOSetups = await Db.SelectAsync<IOSetups>(ios => ios.DeviceId == result.Id && ios.Enabled == "1");
                foreach (NameValuePair nameValuePair in request.IOEndpointList)
                {
                    if (iOSetups != null)
                    {
                        IOSetups endpointResult = null;
                        string ioNum = Regex.Replace(nameValuePair.Name, "[^0-9]+", string.Empty);
                        string ioTypeName = (string.IsNullOrEmpty(ioNum)) ? nameValuePair.Name : nameValuePair.Name.Replace(ioNum, string.Empty);
                        string ioTypeId = GetIOTypeId(ioTypeName);
                        //localIONum/DevIONum not required for vin since there will be always only one record for vin
                        if (string.IsNullOrEmpty(ioNum) && ioTypeName.ToLower() == "vin")
                        {
                            endpointResult = iOSetups.FirstOrDefault(ios => ios.IoTypeID == ioTypeId);
                        }
                        //48 -> X-400, 55 -> X-404
                        //Use localIONum property for X-400 and X-404
                        else if (result.ModelCode == "48" || result.ModelCode == "55")
                        {
                            endpointResult = iOSetups.FirstOrDefault(ios => ios.IoTypeID == ioTypeId && ios.LocalIONum == ioNum);
                        }
                        else
                        {
                            //Use DevIONum property for other model type
                            endpointResult = iOSetups.FirstOrDefault(ios => ios.IoTypeID == ioTypeId && ios.DevIONum == ioNum);
                        }
                        if (endpointResult != null)
                        {
                            deviceUpdateTemp.EndPointId = endpointResult.EndPointId;
                            deviceUpdateTemp.OldValue = endpointResult.Value;
                        }
                    }
                    deviceUpdateTemp.NameCamelCase = nameValuePair.Name;
                    deviceUpdateTemp.Value = nameValuePair.Value;
                    Db.InsertAsync(deviceUpdateTemp);
                }
            }

        }

STDOUT с веб-сервера

: Ben.Diagnostics.BlockingMonitor[6]
      Blocking method has been invoked and blocked, this can lead to threadpool starvation.
         at System.Threading.Tasks.TplEtwProvider.TaskWaitBegin(Int32 OriginatingTaskSchedulerID, Int32 OriginatingTaskID, Int32 TaskID, TaskWaitBehavior Behavior, Int32 ContinueWithTaskID)
         at System.Threading.Tasks.Task.InternalWaitCore(Int32 millisecondsTimeout, CancellationToken cancellationToken)
         at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
         at Serilog.Sinks.PeriodicBatching.PeriodicBatchingSink.EmitBatch(IEnumerable`1 events)
         at Serilog.Sinks.PeriodicBatching.PeriodicBatchingSink.OnTick()
         at Serilog.Sinks.PeriodicBatching.PeriodicBatchingSink.<.ctor>b__8_0(CancellationToken cancel)
         at Serilog.Sinks.PeriodicBatching.PortableTimer.OnTick()
         at Serilog.Sinks.PeriodicBatching.PortableTimer.<.ctor>b__6_0(Object _)
         at System.Threading.TimerQueueTimer.<>c.<.cctor>b__22_0(Object state)
         at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
         at System.Threading.TimerQueueTimer.CallCallback()
         at System.Threading.TimerQueueTimer.Fire()
         at System.Threading.TimerQueue.FireNextTimers()
         at System.Threading.TimerQueue.AppDomainTimerCallback(Int32 id)

Hosting environment: AzureDev
Content root path: D:\home\site\wwwroot
Now listening on: http://127.0.0.1:17717
Application started. Press Ctrl+C to shut down.
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://*****/API/ServiceStatusWithDbCheck  
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://*****/API/ServiceStatusWithDbCheck  
infoinfo: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 POST http://*****/API/Integration/DeleteCompanyCertificateToken application/json 2
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 POST http://*****/API/Integration/DeviceEndpointInsertTemp application/json 536
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 POST http://*****/API/Integration/DeviceEndpointInsertTemp application/json 536
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 POST http://*****/API/Integration/DeviceEndpointInsertTemp application/json 536
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 POST http://*****/API/Integration/DeviceEndpointInsertTemp application/json 536
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 POST http://*****/API/Integration/DeviceEndpointInsertTemp application/json 536
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 POST http://*****/API/Integration/DeviceEndpointInsertTemp application/json 536
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 POST http://*****/API/Integration/DeviceEndpointInsertTemp application/json 536
: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 POST http://*****/API/Integration/DeleteCompanyCertificateToken application/json 2
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 POST http://*****/API/Integration/DeviceEndpointInsertTemp application/json 536
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 POST http://*****/API/Integration/DeviceEndpointInsertTemp application/json 536
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 POST http://*****/API/Integration/DeviceEndpointInsertTemp application/json 536
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 POST http://*****/API/Integration/DeviceEndpointInsertTemp application/json 536
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 POST http://*****/API/Integration/DeviceEndpointInsertTemp application/json 536
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 POST http://*****/API/Integration/DeviceEndpointInsertTemp application/json 536
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 POST http://*****/API/Integration/DeviceEndpointInsertTemp application/json 536
infoinfo: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 1254.2787ms 200 text/html
: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 1254.2787ms 200 text/html
warn: Ben.Diagnostics.BlockingMonitor[6]
...