-
Notifications
You must be signed in to change notification settings - Fork 36
/
PrimeGenController.cs
104 lines (91 loc) · 2.62 KB
/
PrimeGenController.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// Copyright 2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
using System.Numerics;
using Microsoft.AspNetCore.Mvc;
namespace PrimeGenController.Controllers;
[ApiController]
//[Route("[controller]")]
[Route("")]
public class PrimeGenController : ControllerBase
{
private static BigInteger LargestPrime;
private static bool started;
private readonly ILogger<PrimeGenController> _logger;
public PrimeGenController(ILogger<PrimeGenController> logger)
{
_logger = logger;
}
[HttpGet("start")]
public ActionResult Start()
{
if (started)
{
return BadRequest("Already calculating a prime");
}
_logger.LogInformation($"Prime generation starting");
Task.Run(() =>
{
// TODO: Need to check whether this approach works
// What happens when the controller is deleted?
StartPrimeGeneration();
});
return Ok("Started");
}
[HttpGet("stop")]
public ActionResult Stop()
{
_logger.LogInformation($"Prime generation stopping");
StopPrimeGeneration();
return Ok("Stopped");
}
[HttpGet]
public ActionResult<string> Get()
{
_logger.LogInformation($"Returning largest calculated prime");
return Ok(LargestPrime.ToString());
}
private void StartPrimeGeneration()
{
started = true;
BigInteger n = LargestPrime;
while (started)
{
if (isPrime(++n))
{
LargestPrime = n;
}
}
}
private void StopPrimeGeneration()
{
started = false;
}
// An inefficient prime number generator
// to simulate a long running task.
private static bool isPrime(BigInteger n)
{
if (n == 1)
{
return false;
}
for (int i = 2; i < n; i++)
{
if (n % i == 0)
{
return false;
}
}
return true;
}
}