Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections.Concurrent;
- using System.Collections.Generic;
- using System.Threading;
- using System.Threading.Tasks;
- using WindowsService2.Producer;
- namespace WindowsService2
- {
- internal class OperationsManager
- {
- private CancellationTokenSource _cts;
- private List<Task> _tasks;
- private ILogger _logger;
- internal OperationsManager()
- {
- _cts = new CancellationTokenSource();
- _tasks = new List<Task>();
- _logger = new Logger("OperationsManager");
- }
- //internal int ConsumerCount { get; set; }
- internal void Start()
- {
- _logger.Log("Start() called.");
- StartProducer();
- StartConsumers();
- }
- private void StartConsumers()
- {
- // NOP.
- }
- private void StartProducer()
- {
- BlockingCollection<ProducerMessage> blockingCollection = new BlockingCollection<ProducerMessage>();
- Task producerTask = Task.Factory.StartNew(() =>
- {
- ManagementService managementService = new ManagementService(blockingCollection, _cts.Token);
- managementService.Produce();
- }, _cts.Token);
- _tasks.Add(producerTask);
- }
- internal void Stop()
- {
- _logger.Log("Stop() called.");
- _cts.Cancel();
- Task.WaitAll(_tasks.ToArray(), Timeout.Infinite);
- _cts.Dispose();
- }
- }
- }
- using System;
- using System.Collections.Concurrent;
- using System.ServiceModel;
- using System.ServiceModel.Description;
- using System.Threading;
- using WindowsService2.Producer.WCF;
- namespace WindowsService2.Producer
- {
- // this is my "producer"
- internal class ManagementService : Producer
- {
- private Logger _logger;
- private ServiceHost _serviceHost;
- internal ManagementService(BlockingCollection<ProducerMessage> blockingCollection, CancellationToken cancellationToken)
- : base(blockingCollection, cancellationToken)
- {
- _logger = new Logger("ManagementService");
- _cancellationToken.Register(ShutDownWcfEndpoint);
- }
- public override void Produce()
- {
- _logger.Log("Produce() called.");
- StartWcfEndpoint();
- }
- private void StartWcfEndpoint()
- {
- // see https://msdn.microsoft.com/en-us/library/ms731758%28v=vs.110%29.aspx
- Uri baseAddress = new Uri("http://localhost:8080/hello");
- // Create the ServiceHost.
- _serviceHost = new ServiceHost(typeof(HelloWorldService), baseAddress);
- // Enable metadata publishing.
- ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
- smb.HttpGetEnabled = true;
- smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
- _serviceHost.Description.Behaviors.Add(smb);
- // Open the ServiceHost to start listening for messages. Since
- // no endpoints are explicitly configured, the runtime will create
- // one endpoint per base address for each service contract implemented
- // by the service.
- _serviceHost.Open();
- }
- private void ShutDownWcfEndpoint()
- {
- _logger.Log("Shutting down WCF endpoint...");
- _serviceHost.Close();
- _logger.Log("Shutting down WCF endpoint... completed.");
- }
- }
- }
- public class Consumer
- {
- // No code yet.
- // It has an "internal state" and uses TcpListener to communicate with the device.
- // It should be able to take commands from the management service (producer)
- // (like: destroy yourself, what's your status?, ...)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement