fork download
  1. using System;
  2. using System.Threading.Tasks;
  3.  
  4. public class Test
  5. {
  6. public static void Main()
  7. {
  8. var sequencer = new MessagingSequencer();
  9. sequencer.AddMessage("アータタタタタタ");
  10. sequencer.AddPause(2000);
  11. sequencer.AddMessage("アータタタタタタ");
  12. sequencer.AddPause(2000);
  13. sequencer.AddMessage("オーワターっ");
  14. sequencer.AddPause(3000);
  15. sequencer.AddMessage("お前はもう死んでいる。");
  16. Console.ReadKey();
  17. }
  18. }
  19.  
  20. interface IMessagingJob
  21. {
  22. void Action();
  23. }
  24.  
  25. class MessageJob : IMessagingJob
  26. {
  27. public MessageJob(string msg)
  28. {
  29. Message = msg;
  30. }
  31.  
  32. public string Message { get; private set; }
  33.  
  34. void IMessagingJob.Action()
  35. {
  36. Console.WriteLine(Message);
  37. }
  38. }
  39.  
  40. class PauseJob : IMessagingJob
  41. {
  42. public PauseJob(int milliSec)
  43. {
  44. Pause = milliSec;
  45. }
  46.  
  47. public int Pause { get; private set; }
  48.  
  49.  
  50. void IMessagingJob.Action()
  51. {
  52. Task.Delay(Pause).Wait();
  53. }
  54. }
  55.  
  56. class MessagingSequencer
  57. {
  58. public MessagingSequencer()
  59. {
  60. MessagingTask = Task.Run(() => { });
  61. }
  62.  
  63. private Task MessagingTask { get; set;}
  64.  
  65. public void AddJob(IMessagingJob job)
  66. {
  67. MessagingTask = MessagingTask.ContinueWith(t => job.Action());
  68. }
  69.  
  70. public void AddMessage(string message)
  71. {
  72. AddJob(new MessageJob(message));
  73. }
  74.  
  75. public void AddPause(int milliSec)
  76. {
  77. AddJob(new PauseJob(milliSec));
  78. }
  79.  
  80. }
  81.  
Success #stdin #stdout 0.01s 264896KB
stdin
Standard input is empty
stdout
アータタタタタタ