Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET Core的BackgroundService中处理非托管回调_C#_Asp.net Core_Events_Unmanaged - Fatal编程技术网

C# 在ASP.NET Core的BackgroundService中处理非托管回调

C# 在ASP.NET Core的BackgroundService中处理非托管回调,c#,asp.net-core,events,unmanaged,C#,Asp.net Core,Events,Unmanaged,我正在尝试构建一个ASP.NET核心应用程序,该应用程序应该接收非托管代码中的信息,并将这些信息呈现给web用户。当ASP.NET核心应用程序启动时,它将启动后台服务,该服务将在非托管代码中注册回调 在主功能中,我已注册后台服务以启动: public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); }

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

在主功能中,我已注册后台服务以启动:

 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>();
            })
        ;
}
调用SetCallback函数时,非托管代码将开始侦听更新,但在开始侦听时返回

这会奏效吗?当回调被触发时,它会阻止代码的其余部分吗?我应该在OnNewUpdates中使用什么来向ExecuteAsync发出有新更新的信号

更新2020-11-02 也许我的问题不太清楚,所以更清楚地说:

  • 我应该在ExecuteAsync函数中添加什么?什么都没有
  • 将我的服务作为后台服务来实现是错误的吗

在进一步调查之后,我意识到,就像@poke所说的,拥有一个后台服务是错误的,它只需要是一个“正常”的服务。

运行代码时是否遇到任何错误?尝试设置断点或添加记录器,然后调试代码以检查代码是否正常工作。此外,关于ExecuteAsync(),您的意思是要取消正在执行的任务(使用CancellationToken)?如果是这种情况,请尝试使用取消任务,请参阅。“我应该在ExecuteAsync函数中添加什么?什么都没有?”–那么,您希望此服务执行什么操作?如果只是为了注册回调,然后在非托管代码调用回调时执行某些操作,那么您最好直接使用
IHostedService
接口,而不是让线程忙于while循环,而while循环什么都不做。
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
    }

}