c# - 在 ASP.NET/MVC/REST 中使用异步库的正确方法
问题描述
我有一个用于音频文件处理的异步库。此外,我想通过 Rest 提供这些方法。所以我做了一个 MVC WebApi 项目。库需要一些时间来启动,所以我添加了一个类,它提供了一种初始化方法并公开了库主对象。
public static class MusicHandler
{
public static MusicCapture.MusicCapture MusicCapture;
public static void init()
{
MusicCapture = new MusicCapture.MusicCapture("D:\\Temp", "D:\\test", "E:\\FingerPrintDB2.ss");
MusicCapture.Start();
}
}
我在 Application_Start() 中启动它
protected void Application_Start()
{
MusicHandler.init();
}
现在,当我的 init 方法包含一些这样的异步调用时:
var hashedFingerprints = command.Hash().Result;
该程序将跳过这些行。据我所知,他们并没有被处决。当我从 REST 端点调用任何对象异步方法时,也会发生同样的事情。当我不是从 ASP.NET/MVC 运行库时,代码可以完美运行。
我发现一些评论说这是由于死锁而导致的问题,但没有建议或代码如何避免这种情况/使其工作。
先感谢您。
解决方案
所以,如果我理解的话,你想启动一个叫做 a 的东西MusicHandler
,这需要一点时间才能启动。加载后,与您的系统的通信将通过 RESTful HTTP 调用进行。
在您的 MusicHandler 中,您可以有一个标志来说明它是否已完成加载。
public static class MusicHandler
{
public static MusicCapture.MusicCapture MusicCapture;
public static bool Initialized {get;} = False;
public static void init()
{
MusicCapture = new MusicCapture.MusicCapture("D:\\Temp", "D:\\test", "E:\\FingerPrintDB2.ss");
MusicCapture.Start();
Initialized = true;
}
}
然后在您的 MVC 控制器中,您可以检查此标志并在初始化尚未完成时返回错误。
这样,您就不必担心async
一直到顶部。
但我很惊讶你application_start
完全在使用......使用红隼托管它并在其中进行此设置program.cs
或其他东西,您可以在本地与顶部异步。
推荐阅读
- r - 如何用正负条标记水平条形图?(ggbarplot)
- javascript - 为什么 event.pageX 在 Firefox 中不起作用?
- c++ - Rstudio,配置:错误:在libgdal中找不到GDALAllRegister
- swift - 如何在 customTableViewCell 中获取 UITextField 的字符串并将其保存到 coreData?
- excel - Excel:替换特殊字符而不嵌套替换函数或创建函数
- json - Jmeter Maven clean verify 给出“未捕获的异常 java.lang.NoClassDefFoundError:com/jayway/jsonpath/internal/JsonReader”
- c# - C# Finding Nearest Value in a Generic Array?
- neural-network - 我可以在 Keras 中使用带有卷积神经网络的矩形图像吗?
- java - 我被困在我找不到的地方
- css - Chrome插件从网站删除css类