【发布时间】:2020-02-01 10:54:15
【问题描述】:
我有一个用于音频文件处理的异步库。此外,我想通过 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 运行库时,代码可以完美运行。
我发现一些 cmets 说这是由于死锁而导致的问题,但没有建议或代码如何避免这种情况/使其工作。
提前谢谢你。
【问题讨论】:
-
永远不要使用'.Result' 你应该'await command.Hash()'
-
@IeuanW 但是我必须使这个方法异步,一直到顶部,但是 Application_Start() 不是异步的。
-
如果你使用 DI,你不需要在启动时添加任何东西。即,如果您使用单例,那么整个类将准备就绪并等待其他调用者使用。
标签: c# asp.net asynchronous async-await audio-fingerprinting