首页 > 解决方案 > 在 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 运行库时,代码可以完美运行。

我发现一些评论说这是由于死锁而导致的问题,但没有建议或代码如何避免这种情况/使其工作。

先感谢您。

标签: c#asp.netasynchronousasync-awaitaudio-fingerprinting

解决方案


所以,如果我理解的话,你想启动一个叫做 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或其他东西,您可以在本地与顶部异步。


推荐阅读