小编use*_*608的帖子

取消令牌注入

我希望能够通过依赖项注入传递取消令牌,而不是每次都作为参数传递。这是一件事吗?

我们有一个 asp.net-core 2.1 应用程序,我们将来自控制器的调用传递到迷宫般的异步库、处理程序和其他服务中,以满足我们服务的金融科技监管领域的复杂需求。

在请求的顶部,我可以声明我想要一个取消令牌,然后我会得到一个:

[HttpPost]
public async Task<IActionResult> DoSomeComplexThingAsync(object thing, CancellationToken cancellationToken) {
    await _someComplexLibrary.DoThisComplexThingAsync(thing, cancellationToken);
    return Ok();
}
Run Code Online (Sandbox Code Playgroud)

现在,我想成为一名优秀的异步程序员,并确保我的cancellationToken内容通过调用链传递到每个异步方法。我想确保它被传递到 EF、System.IO 流等。我们拥有您期望的所有常用存储库模式和消息传递实践。我们努力保持我们的方法简洁并承担单一责任。我的技术主管明显被“福勒”这个词激怒了。所以我们的类大小和函数体很小,但是我们的调用链非常非常深。

这意味着每一层、每个功能都必须交出该死的令牌:

private readonly ISomething _something;
private readonly IRepository<WeirdType> _repository;

public SomeMessageHandler(ISomething<SomethingElse> something, IRepository<WeirdType> repository) {
    _something = something;
    _repository = repository;
}

public async Task<SomethingResult> Handle(ComplexThing request, CancellationToken cancellationToken) {
    var result = await DoMyPart(cancellationToken);
    cancellationToken.ThrowIfCancellationRequested();
    result.SomethingResult = await _something.DoSomethingElse(result, cancellationToken);
    return result;
}

public async Task<SomethingResult> DoMyPart(ComplexSubThing request, CancellationToken cancellationToken) {
    return await …
Run Code Online (Sandbox Code Playgroud)

.net c# cancellation-token asp.net-core

19
推荐指数
2
解决办法
7173
查看次数

如何以编程方式立即执行 ReccurringJob?

我有很多 Hangfire 经常性工作,效果很好。

但是,我需要添加功能以允许用户抢占计划并立即运行任务。

这是我的启动:

RecurringJob.AddOrUpdate<SendFilesJob>("SendFilesJob", j => j.Execute(), send_schedule);
Run Code Online (Sandbox Code Playgroud)

我告诉用户作业最后一次运行的时间以及下次运行的时间,如下所示:

using (var connection = JobStorage.Current.GetConnection())
{
    foreach (var recurringJob in connection.GetRecurringJobs())
    {
        //report LastExecution, NextExecution, LastJobState
    }
}
Run Code Online (Sandbox Code Playgroud)

这也显示了当前正在通过 处理作业的时间LastJobState,这很棒。

但是,当用户抢占立即运行任务时,我这样调用它:

BackgroundJob.Enqueue<SendFilesJob>(j => j.Execute());
Run Code Online (Sandbox Code Playgroud)

这可行,但它不会与定期的工作录入报告挂钩;LastJobState因此用户看不到或值的变化LastExecution

有没有办法访问它RecurringJob本身并触发它,以便它更新这些值?

hangfire

0
推荐指数
1
解决办法
3473
查看次数

标签 统计

.net ×1

asp.net-core ×1

c# ×1

cancellation-token ×1

hangfire ×1