异步方法似乎不等待,即使它在 C# 中包含 "await" 关键字
The asynchronous method appears not to wait even though it contains "await" keyword in C#
异步 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.
如果 serviceResult<=0
并且行 var serviceResult = await _webServiceDal.SetAlarmLogAsync(alarmLog)
没有引发异常,则可能会出现您得到的行为。尝试在检查后添加一个 else
子句并在那里记录一些内容以查看是否是这种情况。
if (serviceResult > 0) {...} else { _logger.Verbose(...); }
异步 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.
如果 serviceResult<=0
并且行 var serviceResult = await _webServiceDal.SetAlarmLogAsync(alarmLog)
没有引发异常,则可能会出现您得到的行为。尝试在检查后添加一个 else
子句并在那里记录一些内容以查看是否是这种情况。
if (serviceResult > 0) {...} else { _logger.Verbose(...); }