我创建了一个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

08-04 12:47