Compare commits
1 Commits
main
...
56334d6a64
| Author | SHA1 | Date | |
|---|---|---|---|
| 56334d6a64 |
@@ -7,8 +7,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WarhoundConsole", "Warhound
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WarhoundLib", "WarhoundLib\WarhoundLib.csproj", "{7E3472E9-86E9-4032-826C-0DA805C2EBCE}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WarhoundLib", "WarhoundLib\WarhoundLib.csproj", "{7E3472E9-86E9-4032-826C-0DA805C2EBCE}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WarhoundTest", "WarhoundTest\WarhoundTest.csproj", "{D22BEA2A-08E9-498A-A087-FEFB8FA2AD08}"
|
|
||||||
EndProject
|
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -23,10 +21,6 @@ Global
|
|||||||
{7E3472E9-86E9-4032-826C-0DA805C2EBCE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{7E3472E9-86E9-4032-826C-0DA805C2EBCE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{7E3472E9-86E9-4032-826C-0DA805C2EBCE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{7E3472E9-86E9-4032-826C-0DA805C2EBCE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{7E3472E9-86E9-4032-826C-0DA805C2EBCE}.Release|Any CPU.Build.0 = Release|Any CPU
|
{7E3472E9-86E9-4032-826C-0DA805C2EBCE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{D22BEA2A-08E9-498A-A087-FEFB8FA2AD08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{D22BEA2A-08E9-498A-A087-FEFB8FA2AD08}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{D22BEA2A-08E9-498A-A087-FEFB8FA2AD08}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{D22BEA2A-08E9-498A-A087-FEFB8FA2AD08}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
@@ -1,61 +0,0 @@
|
|||||||
namespace WarhoundConsole
|
|
||||||
{
|
|
||||||
public abstract class Job
|
|
||||||
{
|
|
||||||
private readonly TimeSpan interval;
|
|
||||||
|
|
||||||
private Task task;
|
|
||||||
private DateTime lastExecutedTime;
|
|
||||||
|
|
||||||
public Job(TimeSpan interval)
|
|
||||||
{
|
|
||||||
if (interval <= TimeSpan.Zero)
|
|
||||||
{
|
|
||||||
throw new ArgumentOutOfRangeException(nameof(interval));
|
|
||||||
}
|
|
||||||
|
|
||||||
this.interval = interval;
|
|
||||||
this.task = Task.CompletedTask;
|
|
||||||
this.lastExecutedTime = DateTime.MinValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool TryExecute()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var now = DateTime.Now;
|
|
||||||
if (now - this.lastExecutedTime < this.interval)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this.task.IsCompleted)
|
|
||||||
{
|
|
||||||
// 이 경우 로그를 출력하도록 하고, 타이밍을 조절해야한다.
|
|
||||||
//Console.WriteLine($"Job skipped at {DateTime.Now}");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.lastExecutedTime = now;
|
|
||||||
|
|
||||||
this.task = Task.Run(async () =>
|
|
||||||
{
|
|
||||||
await this.Execute();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Console.WriteLine(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract Task Execute();
|
|
||||||
|
|
||||||
public void Wait()
|
|
||||||
{
|
|
||||||
this.task?.Wait();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,66 +1,10 @@
|
|||||||
|
namespace WarhoundConsole
|
||||||
using System.Diagnostics;
|
|
||||||
|
|
||||||
namespace WarhoundConsole
|
|
||||||
{
|
{
|
||||||
public class Program
|
internal class Program
|
||||||
{
|
{
|
||||||
public static int Main(string[] args)
|
static void Main(string[] args)
|
||||||
{
|
{
|
||||||
try
|
Console.WriteLine("Hello, World!");
|
||||||
{
|
|
||||||
MainInternal(args);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Console.WriteLine(e);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void MainInternal(string[] args)
|
|
||||||
{
|
|
||||||
Singleton.I.Initialize(new());
|
|
||||||
|
|
||||||
var jobs = new List<Job>();
|
|
||||||
|
|
||||||
var sw = Stopwatch.StartNew();
|
|
||||||
while (!Singleton.I.ExitRequested)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
sw.Restart();
|
|
||||||
foreach (var job in jobs)
|
|
||||||
{
|
|
||||||
_ = job.TryExecute();
|
|
||||||
}
|
|
||||||
sw.Stop();
|
|
||||||
|
|
||||||
const int targetFrameTimeMs = 10;
|
|
||||||
if (sw.Elapsed.Milliseconds < targetFrameTimeMs)
|
|
||||||
{
|
|
||||||
Thread.Sleep(targetFrameTimeMs - sw.Elapsed.Milliseconds);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Console.WriteLine(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var job in jobs)
|
|
||||||
{
|
|
||||||
job.Wait();
|
|
||||||
}
|
|
||||||
|
|
||||||
Shutdown();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void Shutdown()
|
|
||||||
{
|
|
||||||
// DO SOMETHING
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,57 +0,0 @@
|
|||||||
namespace WarhoundConsole
|
|
||||||
{
|
|
||||||
public sealed class Singleton
|
|
||||||
{
|
|
||||||
public sealed class InitializeParams
|
|
||||||
{
|
|
||||||
// FILL SOMETHING
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Singleton I => i ??= new();
|
|
||||||
private static Singleton? i = null;
|
|
||||||
|
|
||||||
private bool isInitialized;
|
|
||||||
|
|
||||||
public bool ExitRequested { get; private set; }
|
|
||||||
|
|
||||||
private Singleton()
|
|
||||||
{
|
|
||||||
this.isInitialized = false;
|
|
||||||
this.ExitRequested = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Initialize(InitializeParams initializeParams)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (this.isInitialized)
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException("이미 초기화된 싱글톤");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (initializeParams == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(initializeParams));
|
|
||||||
}
|
|
||||||
|
|
||||||
this.InitializeInternal(initializeParams);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
this.isInitialized = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void InitializeInternal(InitializeParams initializeParams)
|
|
||||||
{
|
|
||||||
// DO SOMETHING
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Exit()
|
|
||||||
{
|
|
||||||
this.ExitRequested = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -8,9 +8,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\WarhoundLib\WarhoundLib.csproj" />
|
<ProjectReference Include="..\WarhoundLib\WarhoundLib.csproj" />
|
||||||
<FrameworkReference Include="Microsoft.AspNetCore.App" />
|
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.4" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -12,8 +12,4 @@
|
|||||||
<TestingPlatformShowTestsFailure>true</TestingPlatformShowTestsFailure>
|
<TestingPlatformShowTestsFailure>true</TestingPlatformShowTestsFailure>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\WarhoundLib\WarhoundLib.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
Reference in New Issue
Block a user