繁体   English   中英

具有托管服务的基于ASP.NET Core事件的后台任务

[英]ASP.NET Core event based background tasks with hosted services

我在ASP.NET Core托管服务中使用后台任务处理while循环和事件时遇到了一些麻烦。 我正在尝试从while (!cancellationToken.IsCancellationRequested)部分中触发我的Progress_Changed事件,以便在应用程序运行时连续捕获数据。 我一直在遵循这些指南:

ASP.NET Core中的托管服务的后台任务

使用IHostedService和BackgroundService类在微服务中实现后台任务

如何在保持BackgroundService连续循环的同时捕获事件,以便始终能够获取数据? 我希望将其与SignalR一起使用,以便将数据馈送到集线器。

public class MyBackgroundService : BackgroundService
{
    private readonly ICustomService _service;
    private IProgress<JSONMessage> _progress;

    public MyBackgroundService(ICustomService service)
    {
        _service = service;
        _progress = new Progress<JSONMessage>();
        _progress.ProgressChagned += Progress_Changed;
    {

    protected override async Task ExecuteAsync(CancellationToken cancellationToken)
    {
        await _service.StartService(_progress);

        while (!cancellationToken.IsCancellationRequested)
        {
            await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
        }
    }

    private void Progress_Changed(object s, JSONMessage e)
    {
        Console.WriteLine(e.Id);
    }
}

由于各种原因,在IIS中长时间运行任务可能会很棘手。 它可能更容易对这种东西委托给, 只是工作方式类似于迟发型库。 https://www.hangfire.io/

我可能是错的,但这对我来说似乎是一个僵局。 默认情况下, await捕获当前的SynchronizationContext ,然后在完成后将其回发。 出于很多原因,我在IIS / ASP.NET中会遇到很多麻烦。 请尝试以下代码:

protected override async Task ExecuteAsync(CancellationToken cancellationToken)
{
    await _service.StartService(_progress).ConfigureAwait(false);

    while (!cancellationToken.IsCancellationRequested)
    {
        await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
    }
}

此处所做的唯一更改是禁用回发到我所说的捕获上下文。 请注意,这意味着在调用await之后,您可能处于其他线程上。 因此,您可以将其视为黑客行为,但是在需要回发的方法中,我看不到任何东西。

如果那不能解决问题,我会将调试器附加到发行版中 或使用探查器查看实际发生的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM