首页 > 解决方案 > 异步方法似乎不等待,即使它在 C# 中包含“await”关键字

问题描述

异步SetAlarmLogToWebServiceAsync()方法似乎不等待,即使它包含“await”关键字。

下面的代码写入了意外的日志。

//Client Side
private async void FrmMain_Load(object sender, EventArgs e)
{
    await StartAllTasksAsync();
}

private async Task StartAllTasksAsync()
{
    var task = SetAlarmLogToWebServiceAsync();
    return Task.WhenAll(task);
}

public async Task SetAlarmLogToWebServiceAsync()
{
    while (true)
    {
        await Task.Delay(300);
        await _alarmLogManager.SetAlarmLogToWebServiceAsync();
    }
}

//Business Logic Side
public async Task SetAlarmLogToWebServiceAsync()
{
    var alarmLog = (await _alarmLogDal.GetListAsync()).FirstOrDefault();
    _logger.Verbose($"AlarmLog was gotten from db. AlarmId: {alarmLog.AlarmId}");
    
    try
    {
        var serviceResult = await _webServiceDal.SetAlarmLogAsync(alarmLog);
        if (serviceResult > 0)
        {
            _logger.Verbose($"AlarmLog was sent to web service. AlarmId: {alarmLog.AlarmId}");
            var dbResult = await _alarmLogDal.UpdateServiceStatusAsync(alarmLog);
        }
    }
    catch (Exception ex)
    {
        _logger.Error($"Error on sending AlarmLog to WebService. AlarmId: {alarmLog.AlarmId}" +
            $"\n    Exception message: {ex.Message}");
        await Task.Delay(3000);
    }
}

日志:

2020-11-19 12:09:50.718 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:51.490 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:51.863 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:52.230 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:52.563 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:52.888 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:53.215 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:53.567 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:53.935 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:54.300 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:54.678 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:55.031 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:55.384 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:55.735 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:56.060 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:56.386 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:56.716 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:57.047 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:57.371 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:57.700 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:58.030 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:58.382 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:58.738 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:59.073 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:59.482 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:09:59.809 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:00.138 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:00.468 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:00.833 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:01.200 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:11.202 +03:00 [ERR] Error on sending AlarmLog to WebService. AlarmId: 86944
    Exception message: A task was canceled.
2020-11-19 12:10:14.543 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:24.546 +03:00 [ERR] Error on sending AlarmLog to WebService. AlarmId: 86944
    Exception message: A task was canceled.
2020-11-19 12:10:27.907 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:28.725 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:29.057 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:29.390 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:29.715 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:30.043 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:30.408 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:30.754 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:31.114 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:31.493 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:31.864 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:32.189 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:32.516 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:32.841 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:33.169 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:33.498 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:43.502 +03:00 [ERR] Error on sending AlarmLog to WebService. AlarmId: 86944
    Exception message: A task was canceled.
2020-11-19 12:10:46.848 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:56.862 +03:00 [ERR] Error on sending AlarmLog to WebService. AlarmId: 86944
    Exception message: A task was canceled.

我正在使用 Serilog 进行日志记录。记录器的创建方式如下:

public static Serilog.ILogger GetSerilogAsyncFileLogger(int retainedFileCountLimit = 2)
{
    return new LoggerConfiguration()
        .WriteTo.Async(a =>
        {
            a.File(
                path: "logs\\log.txt",
                outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}",
                rollingInterval: RollingInterval.Day,
                fileSizeLimitBytes: 500000000,
                rollOnFileSizeLimit: true,
                retainedFileCountLimit: retainedFileCountLimit);
        })
        .MinimumLevel.Verbose()
        .CreateLogger();
}

SetAlarmLogToWebServiceAsync()必须等待所有呼叫。我期望下面的日志。我怎样才能得到下面的日志?

2020-11-19 12:10:01.200 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:11.202 +03:00 [ERR] Error on sending AlarmLog to WebService. AlarmId: 86944
    Exception message: A task was canceled.
2020-11-19 12:10:01.200 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:11.202 +03:00 [ERR] Error on sending AlarmLog to WebService. AlarmId: 86944
    Exception message: A task was canceled.
2020-11-19 12:10:01.200 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:11.202 +03:00 [ERR] Error on sending AlarmLog to WebService. AlarmId: 86944
    Exception message: A task was canceled.
2020-11-19 12:10:01.200 +03:00 [VRB] AlarmLog was gotten from db. AlarmId: 86944
2020-11-19 12:10:11.202 +03:00 [ERR] Error on sending AlarmLog to WebService. AlarmId: 86944
    Exception message: A task was canceled.

标签: c#async-awaitserilog

解决方案


serviceResult<=0如果并且该行var serviceResult = await _webServiceDal.SetAlarmLogAsync(alarmLog)没有引发异常,则可能会出现您得到的行为。尝试else在检查后添加一个子句并在那里记录一些内容以查看是否是这种情况。

if (serviceResult > 0) {...} else { _logger.Verbose(...); }

推荐阅读