在ASP.NET Core

问题描述

我正在尝试构建一个ASP.NET Core应用程序,该应用程序应以非托管代码的形式接收信息,并将此信息呈现给Web用户。当ASP.NET Core应用程序启动时,它将启动一个后台服务,该服务将在非托管代码注册一个回调。

在Main功能中,我已经注册了要启动的后台服务:

 public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            }).ConfigureServices(services =>
            {
                services.AddHostedService<ReadService>();
            })
        ;
}

然后在后台服务中,我在非托管代码注册回调:

public class ReadService: BackgroundService
{
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void CSCALLBACK([In,MarshalAs(UnmanagedType.LPStr)] string a);

    [DllImport("managed_service_wrapper",CallingConvention = CallingConvention.Cdecl)]
    public static extern int SetCallback(CSCALLBACK callback);

    public ReadService()
    {
        CSCALLBACK cb = OnNewUpdates;
        var a = SetCallback(cb);
    }
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            //something
        }
    }

    static void OnNewUpdates(string a)
    {
        //something
    }

}

调用SetCallback函数时,非托管代码将开始侦听更新,但在开始侦听时将返回。

这还行吗?当回调被触发时,它将阻塞其余代码吗?我应该在OnNewUpdates中使用什么来通知ExecuteAsync有新的更新?

更新2020-11-02 也许我的问题不是很清楚,所以要更清楚:

  • 我应该在ExecuteAsync函数添加什么?什么都没?
  • 将我的服务实现为BackgroundService是错误的吗?

解决方法

进一步研究之后,我意识到,就像@poke所说的那样,拥有BackgroundService是错误的,它只需要是一种“正常”服务即可。