Advertisement
Guest User

Untitled

a guest
Apr 25th, 2015
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.71 KB | None | 0 0
  1. using System.Collections.Concurrent;
  2. using System.Collections.Generic;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5. using WindowsService2.Producer;
  6.  
  7. namespace WindowsService2
  8. {
  9. internal class OperationsManager
  10. {
  11. private CancellationTokenSource _cts;
  12. private List<Task> _tasks;
  13. private ILogger _logger;
  14.  
  15. internal OperationsManager()
  16. {
  17. _cts = new CancellationTokenSource();
  18. _tasks = new List<Task>();
  19. _logger = new Logger("OperationsManager");
  20. }
  21.  
  22. //internal int ConsumerCount { get; set; }
  23.  
  24. internal void Start()
  25. {
  26. _logger.Log("Start() called.");
  27.  
  28. StartProducer();
  29. StartConsumers();
  30. }
  31.  
  32. private void StartConsumers()
  33. {
  34. // NOP.
  35. }
  36.  
  37. private void StartProducer()
  38. {
  39. BlockingCollection<ProducerMessage> blockingCollection = new BlockingCollection<ProducerMessage>();
  40.  
  41. Task producerTask = Task.Factory.StartNew(() =>
  42. {
  43. ManagementService managementService = new ManagementService(blockingCollection, _cts.Token);
  44. managementService.Produce();
  45. }, _cts.Token);
  46.  
  47. _tasks.Add(producerTask);
  48. }
  49.  
  50. internal void Stop()
  51. {
  52. _logger.Log("Stop() called.");
  53.  
  54. _cts.Cancel();
  55. Task.WaitAll(_tasks.ToArray(), Timeout.Infinite);
  56.  
  57. _cts.Dispose();
  58. }
  59. }
  60. }
  61.  
  62. using System;
  63. using System.Collections.Concurrent;
  64. using System.ServiceModel;
  65. using System.ServiceModel.Description;
  66. using System.Threading;
  67. using WindowsService2.Producer.WCF;
  68.  
  69. namespace WindowsService2.Producer
  70. {
  71. // this is my "producer"
  72. internal class ManagementService : Producer
  73. {
  74. private Logger _logger;
  75. private ServiceHost _serviceHost;
  76.  
  77. internal ManagementService(BlockingCollection<ProducerMessage> blockingCollection, CancellationToken cancellationToken)
  78. : base(blockingCollection, cancellationToken)
  79. {
  80. _logger = new Logger("ManagementService");
  81. _cancellationToken.Register(ShutDownWcfEndpoint);
  82. }
  83.  
  84. public override void Produce()
  85. {
  86. _logger.Log("Produce() called.");
  87.  
  88. StartWcfEndpoint();
  89. }
  90.  
  91. private void StartWcfEndpoint()
  92. {
  93. // see https://msdn.microsoft.com/en-us/library/ms731758%28v=vs.110%29.aspx
  94. Uri baseAddress = new Uri("http://localhost:8080/hello");
  95.  
  96. // Create the ServiceHost.
  97. _serviceHost = new ServiceHost(typeof(HelloWorldService), baseAddress);
  98.  
  99. // Enable metadata publishing.
  100. ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
  101. smb.HttpGetEnabled = true;
  102. smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
  103. _serviceHost.Description.Behaviors.Add(smb);
  104.  
  105. // Open the ServiceHost to start listening for messages. Since
  106. // no endpoints are explicitly configured, the runtime will create
  107. // one endpoint per base address for each service contract implemented
  108. // by the service.
  109. _serviceHost.Open();
  110. }
  111.  
  112. private void ShutDownWcfEndpoint()
  113. {
  114. _logger.Log("Shutting down WCF endpoint...");
  115. _serviceHost.Close();
  116.  
  117. _logger.Log("Shutting down WCF endpoint... completed.");
  118. }
  119. }
  120. }
  121.  
  122. public class Consumer
  123. {
  124. // No code yet.
  125. // It has an "internal state" and uses TcpListener to communicate with the device.
  126. // It should be able to take commands from the management service (producer)
  127. // (like: destroy yourself, what's your status?, ...)
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement