下面我将介绍一个处理设备通知逻辑的Azure Web App的一部分。我正在做的是从ASP MVC控制器调用下面显示的代码。 但是当我运行它时,我从浏览器获得一个挂起(永久挂起)的请求。
我以为我通过在BackgroundWorker线程中包装SendAsync调用找到了一种解决方法。它更好,但我不能正常工作。前几次(一两次)它可以正常工作,但随后再次发生,包装的线程会挂起。
代码与MSDN上的控制台应用程序的代码差别不大。我错过了什么?
using System.Web.Configuration;
using Microsoft.Azure.Devices;
namespace MyTest
{
public class Sender
{
private readonly string connectionString;
private readonly Microsoft.Azure.Devices.ServiceClient serviceClient;
public Sender()
{
connectionString = WebConfigurationManager.AppSettings["ConnectionString"];
serviceClient = ServiceClient.CreateFromConnectionString(connectionString);
}
public async void SendRequest(string deviceId, string msgText)
{
var message = new Message();
message.Properties.Add("text", msgText));
await serviceClient.SendAsync(deviceId, message);
}
}
}
答案 0 :(得分:1)
问题是由于ASP MVC框架使用不当造成的。
事实证明,当使用长时间运行的async \ await时,必须使用AsyncController而不仅仅是Controller。管道必须始终是异步的。