Search
 
SCRIPT & CODE EXAMPLE
 
CODE EXAMPLE FOR CSHARP

How to build a rest component with very long process

// One way is to build 3 types of classes
// 1. controller which sends to the 
// 2. A class that implements a sender and receiver of messages (messageTransfer)
// 3. A worker that recieves from messageTranfer on a loop (best to use with the infinite loop a cancellation token)
// Response could be in some DB where service will get from it

//Class one:
namespace Example.Controllers
{
    [Route("/")]
    [ApiController]
    public class ExampleController : ControllerBase
    {
        readonly IRequestSender _requestSender;

        public PurgeController(IRequestSender requestSender)
        {
            _requestSender = requestSender;
        }

        [HttpPost("example")]
        public async Task<IActionResult> Example()
        {
        	//get or create a decription DTO
        	_requestSender.Send(descDTO);
        }
      }
 }
 
 namespace Example.Impl
{
    public class MessageTransfer : IRequestProvider, IRequestSender
    {
        private readonly IStopTokenProvider _stopTokenProvider;
        //Some dataModel (queue, dict)
        
        public MessageTransfer(IStopTokenProvider stopTokenProvider)
        {
            _stopTokenProvider = stopTokenProvider;
            Task.Run(() => MessageTransferRunnerAsync());
        }
        
        private async Task MessageTransferRunnerAsync()
        {
        	//loop for keeping DataModel alice
        }
	}
    
    public bool Send(DescDTO descDTO)
        {
            if(!_testsDict.TryAdd(descDTO.Type, 1)) //check if you are not handling same handle
            	return false;
            _queue.Enqueue(descDTO);
            return true;
        }

        public DescDTO GetNextAsync(CancellationToken cancellationToken)
        {
            _queue.TryDequeue(descDTO);
        }
 }
 
 namespace Example.Impl
{
    public class Service
    {
    	readonly IRequestProvider _requestProvider;

        public Service(IRequestProvider requestProvider)
        {
            _requestProvider = requestProvider;
            Task.Run(() => RunnerAsync());
        }
        
        private async Task RunnerAsync()
        {
        	//loop and every a few seconds: _requestProvider.TryDequeue()
        }
    }
}
 
 
 
PREVIOUS NEXT
Tagged: #How #build #rest #component #long #process
ADD COMMENT
Topic
Name
6+1 =