我创建了一个Azure函数。它除了一件事之外还可以正常工作:尽管内容始终相同,但它并不总是将内容插入Azure SQL服务器。根据日志,将触发该功能,但不会插入任何行。看来它是随机发生的。这是代码:
public static void Run(string myIoTHubMessage, TraceWriter log)
{
log.Info(myIoTHubMessage);
if (!string.IsNullOrEmpty(myIoTHubMessage))
{
try
{
var str = ConfigurationManager.ConnectionStrings["db-messaging"].ConnectionString;
using (SqlConnection conn = new SqlConnection(str))
{
conn.Open();
log.Info("Connection opened");
var text = $"INSERT INTO [dbo].[MESSAGE] VALUES ('{myIoTHubMessage}')";
using (SqlCommand cmd = new SqlCommand(text, conn))
{
var rows = cmd.ExecuteNonQueryAsync();
}
}
log.Info($"C# IoT Hub trigger function processed a message: {myIoTHubMessage}");
}
catch (Exception ex)
{
log.Error($"C# Event Hub trigger function exception: {ex.Message}");
}
}
}
最佳答案
在这种情况下,您应该在某个地方等待ExecuteNonQueryAsync()方法,或者不使用Async方法。
我认为您的using块在方法完成之前结束。
额外说明:using块可确保调用Dispose()。调用Dispose()是一件好事,因为您使用的是与外部资源(SQL服务器)的连接。如果您不调用Dispose,则您的程序不再需要保留连接时,连接可以保持活动状态。
但是,由于未“等待”对异步方法的调用,因此程序在分配连接之前不会等待ExecuteNonQueryAsync()完成(因为它在“后台”中运行)。
有时ExecuteNonQueryAsync()在调用Dispose()之前完成,有时ExecuteNonQueryAsync()太慢。 “运气”的事项。这解释了您结果的差异。
关于使用块:MSDN on using
在aysnc方法上:MSDN on Async Await