实用技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > ASP.NET > 实用技巧 > .NET计时器和提醒

.NET分布式Orleans计时器和提醒功能实现

作者:chester·chen

Timer是一种用于创建定期粒度行为的机制,与标准的.NET System.Threading.Timer类相似,Orleans 的 Timer允许在一段时间后执行特定的操作,或者在特定的时间间隔内重复执行操作,这篇文章主要介绍了.NET分布式Orleans 计时器和提醒,需要的朋友可以参考下

Timer是什么

Timer 是一种用于创建定期粒度行为的机制。

与标准的 .NET System.Threading.Timer 类相似,Orleans 的 Timer 允许在一段时间后执行特定的操作,或者在特定的时间间隔内重复执行操作。

它在分布式系统中具有重要作用,特别是在处理需要周期性执行的任务时非常有用。

Timer的注意事项

代码示例

public class PlayerGrain : Grain, IPlayerGrain
{
    public Task<string> GetPlayerInfo()
    {
        var timer = RegisterTimer(DoSomething, null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));
        return Task.FromResult($"Player ID: {this.GetPrimaryKeyString()}");
    }
    private async Task DoSomething(object state)
    {
        // 在这里定义要执行的操作
        await Task.Delay(5000);
        Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} Timer Triggered: {this.GetPrimaryKeyString()}");
    }
}

Reminder与Timer的区别

提醒(Reminder)是一种在 Orleans 中用于处理周期性任务的机制,与计时器类似,但具有一些重要区别:

如果想使用reminder,需要安装nuget包

<PackageReference Include="Microsoft.Orleans.Reminders" Version="8.0.0" />

并开启reminder

silBuilder.UseInMemoryReminderService();

Grain需要实现接口 IRemindable ,并使用this.RegisterOrUpdateReminder 注册reminder

public interface IPlayerGrain : IGrainWithStringKey, IRemindable
{
    Task<string> GetPlayerInfo();
}
public class PlayerGrain : Grain, IPlayerGrain
{
    public Task<string> GetPlayerInfo()
    {
        this.RegisterOrUpdateReminder("myReminder", TimeSpan.FromSeconds(5), TimeSpan.FromMinutes(1));
        return Task.FromResult($"Player ID: {this.GetPrimaryKeyString()}");
    }
    public Task ReceiveReminder(string reminderName, TickStatus status)
    {
        Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} Reminder Triggered: {this.GetPrimaryKeyString()}");return Task.CompletedTask;
    }
}

Timer 和 Reminder 场景

使用定时器(Timer)的场景:

使用提醒(Reminder)的场景:

依赖注入创建Timer与Reminder

将 ITimerRegistry 或 IReminderRegistry 注入粒度的构造函数中,也可以创建Timer与Reminder

public PlayerGrain(ITimerRegistry timerRegistry,
IReminderRegistry reminderRegistry,
IGrainContext grainContext)
{
    timerRegistry.RegisterTimer(grainContext,DoSomething,null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));
    reminderRegistry.RegisterOrUpdateReminder(grainContext.GrainId,"testreminder",TimeSpan.FromSeconds(5), TimeSpan.FromMinutes(1));
}

到此这篇关于.NET分布式Orleans - 4 - 计时器和提醒的文章就介绍到这了,更多相关.NET计时器和提醒内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文