ToB企服应用市场:ToB评测及商务社交产业平台

标题: .NET分布式Orleans - 4 - 计时器和提醒 [打印本页]

作者: 莱莱    时间: 2024-5-15 10:11
标题: .NET分布式Orleans - 4 - 计时器和提醒
Timer是什么

Timer 是一种用于创建定期粒度行为的机制。
与标准的 .NET System.Threading.Timer 类相似,Orleans 的 Timer 答应在一段时间后执行特定的操纵,大概在特定的时间隔断内重复执行操纵。
它在分布式体系中具有重要作用,特别是在处理需要周期性执行的任务时非常有效。
Timer的留意事项

代码示例
  1. public class PlayerGrain : Grain, IPlayerGrain
  2. {
  3.     public Task<string> GetPlayerInfo()
  4.     {
  5.         var timer = RegisterTimer(DoSomething, null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));
  6.         return Task.FromResult($"Player ID: {this.GetPrimaryKeyString()}");
  7.     }
  8.     private async Task DoSomething(object state)
  9.     {
  10.         // 在这里定义要执行的操作
  11.         await Task.Delay(5000);
  12.         Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} Timer Triggered: {this.GetPrimaryKeyString()}");
  13.     }
  14. }
复制代码

Reminder与Timer的区别

提醒(Reminder)是一种在 Orleans 中用于处理周期性任务的机制,与计时器类似,但具有一些重要区别:
如果想使用reminder,需要安装nuget包
  1. [/code]并开启reminder
  2. [code]silBuilder.UseInMemoryReminderService();
复制代码
Grain需要实现接口 IRemindable ,并使用this.RegisterOrUpdateReminder 注册reminder
  1. public interface IPlayerGrain : IGrainWithStringKey, IRemindable
  2. {
  3.     Task<string> GetPlayerInfo();
  4. }
  5. public class PlayerGrain : Grain, IPlayerGrain
  6. {
  7.     public Task<string> GetPlayerInfo()
  8.     {
  9.         this.RegisterOrUpdateReminder("myReminder", TimeSpan.FromSeconds(5), TimeSpan.FromMinutes(1));
  10.         return Task.FromResult($"Player ID: {this.GetPrimaryKeyString()}");
  11.     }
  12.     public Task ReceiveReminder(string reminderName, TickStatus status)
  13.     {
  14.         Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} Reminder Triggered: {this.GetPrimaryKeyString()}");return Task.CompletedTask;
  15.     }
  16. }
复制代码

Timer 和 Reminder 场景

使用定时器(Timer)的场景:
使用提醒(Reminder)的场景:
依靠注入创建Timer与Reminder

将 ITimerRegistry 或 IReminderRegistry 注入粒度的构造函数中,也可以创建Timer与Reminder
  1. public PlayerGrain(ITimerRegistry timerRegistry,
  2. IReminderRegistry reminderRegistry,
  3. IGrainContext grainContext)
  4. {
  5.     timerRegistry.RegisterTimer(grainContext,DoSomething,null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));
  6.     reminderRegistry.RegisterOrUpdateReminder(grainContext.GrainId,"testreminder",TimeSpan.FromSeconds(5), TimeSpan.FromMinutes(1));
  7. }
复制代码

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4