在 ASP.NET Core 中处理 BackgroundService 中的非托管回调
Handle unmanaged callback in BackgroundService in ASP.NET Core
我正在尝试构建一个 ASP.NET 核心应用程序,它应该接收非托管代码中的信息并将该信息呈现给网络用户。当 ASP.NET 核心应用程序启动时,它将启动一个后台服务,该服务将在非托管代码中注册一个回调。
在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 函数时,非托管代码将开始侦听更新,但 return 将在开始侦听时启动。
这还能用吗?当触发回调时,它会阻塞其余代码吗?我应该在 OnNewUpdates 中使用什么来向 ExecuteAsync 发出有新更新的信号?
更新2020-11-02
也许我的问题不是很清楚所以说得更清楚:
- 我应该在 ExecuteAsync 函数中放入什么?什么都没有?
- 将我的服务实现为 BackgroundService 是错误的吗?
在进一步调查之后,我意识到就像@poke 说拥有 BackgroundService 是错误的,它只需要是一个“正常”服务即可。
我正在尝试构建一个 ASP.NET 核心应用程序,它应该接收非托管代码中的信息并将该信息呈现给网络用户。当 ASP.NET 核心应用程序启动时,它将启动一个后台服务,该服务将在非托管代码中注册一个回调。
在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 函数时,非托管代码将开始侦听更新,但 return 将在开始侦听时启动。
这还能用吗?当触发回调时,它会阻塞其余代码吗?我应该在 OnNewUpdates 中使用什么来向 ExecuteAsync 发出有新更新的信号?
更新2020-11-02 也许我的问题不是很清楚所以说得更清楚:
- 我应该在 ExecuteAsync 函数中放入什么?什么都没有?
- 将我的服务实现为 BackgroundService 是错误的吗?
在进一步调查之后,我意识到就像@poke 说拥有 BackgroundService 是错误的,它只需要是一个“正常”服务即可。