.NET Core 3.1控制台应用程序挂起

时间:2020-03-05 17:25:24

标签: .net-core npgsql .net-core-3.1

我有一个运行某些后台cron作业的.NET Core 3.1控制台应用程序。有不同的工作在做不同的事情,它们将每隔x分钟开始一次,开始做某事,然后停止。在大多数情况下,它们运行良好,但最近这些工作已开始停止。他们只是从未完成,过程陷于僵局。

我真的不知道如何调试它或找出导致它挂起的原因。我所做的是:

  • 从任务管理器创建一个DMP文件
  • 使用dotnet dump analyze myfile.DMP
  • 加载
  • 运行dumpasync -stacks

这给出了所有堆栈的列表。我已经从不同的工作人员(做不同的事情)创建了几个DMP文件,但它们的共同点是Npgsql.NpgsqlReadBuffer上只有一项任务。

这是一个例子:

000001ed01aa18c8 00007ffca0c9e3d8      128          1 Npgsql.NpgsqlReadBuffer+<>c__DisplayClass34_0+<<Ensure>g__EnsureLong|0>d
Async "stack":
.000001ed01aa1988 (1) Npgsql.NpgsqlConnector+<>c__DisplayClass160_0+<<DoReadMessage>g__ReadMessageLong|0>d
..000001ed01aa1a40 (5) Npgsql.NpgsqlDataReader+<NextResult>d__44
...000001ed01aa1ae0 (0) Npgsql.NpgsqlCommand+<ExecuteReaderAsync>d__102
....000001ed01aa1b90 (0) Npgsql.NpgsqlCommand+<ExecuteDbDataReaderAsync>d__97
.....000001ed01aa1c10 (1) Dapper.SqlMapper+<QueryAsync>d__33`1[[System.__Canon, System.Private.CoreLib]]
......000001ed021ac5d8 (3) Acme.Common.Data.Dapper.Repositories.AccountItems.GetDapperAccountItemsHandlerSql+<GetAccountItemsAsync>d__3
.......000001ed021ac638 (0) Acme.Common.Data.Dapper.Repositories.ItemRepository`1+<GetAccountItemsHigherThanIdAsync>d__9[[Acme.Core.Db.Dapper.DapperReaderConnection, Acme.Core.Db.Dapper]]
........000001ed021ac698 (1) Acme.Common.Services.EmailReport.ReportDataService+<MakeInstantAlertDto>d__20
.........000001ed00badd90 (3) Acme.Common.Services.EmailReport.ReportDataService+<GetReportDtoAsync>d__19
..........000001ed0105f968 (2) Acme.Common.Services.EmailReport.InstantAlertReportService+<SendInstantAlertReportAsync>d__6
...........000001ed0105f9c8 (0) Acme.Common.Services.EmailReport.EmailReportWorkerService+<SendInstantAlertReportsAsync>d__10
............000001ed01b902d0 System.Threading.Tasks.TaskFactory+CompleteOnInvokePromise

我不知道这是否意味着npgsql是导致挂起的原因,但这似乎是所有这些之间的共同点。

连接创建如下:

public async Task<IEnumerable<MyDto>> GetData()
{
    using (var dbConnection = await _dapperConnection.OpenAsync())
    {
        var sql = "SELECT * FROM ....";
        var result = await dbConnection.QueryAsync<MyDto>(sql);
        return result;
    }
}

private async Task<NpgsqlConnection> OpenAsync(CancellationToken cancellationToken = default)
{
    var connection = new NpgsqlConnection(_connectionString);
    await connection.OpenAsync(cancellationToken);

    return connection;
}

连接字符串如下所示: User ID=<userid>;Password=<password>;Host=<host>;Port=5432;Database=<databasename>;Pooling=true;Maximum Pool Size=200;Keepalive=30;

如何进一步调试?有什么帮助?

其他技术细节

Npgsql版本:4.1.3

PostgreSQL版本:9.6

操作系统:Windows

0 个答案:

没有答案