using Newtonsoft.Json; namespace skyscraper8.Tests.NUnit; public sealed class VoileOnlineUploader { public static void Upload(VoileOnlineTestPost voileOnlinePost) { if (_instance == null) { _instance = new VoileOnlineUploader(); } _instance.PushResult(voileOnlinePost); } private static VoileOnlineUploader _instance; private Thread _uploaderThread; private Queue _queue; private void PushResult(VoileOnlineTestPost voileOnlinePost) { if (_queue == null) _queue = new Queue(); lock (_queue) { _queue.Enqueue(voileOnlinePost); } if (_uploaderThread == null) { _uploaderThread = new Thread(PusherThread); _uploaderThread.Priority = ThreadPriority.Lowest; _uploaderThread.Name = "VoileOnlineUploader"; } switch (_uploaderThread.ThreadState) { case ThreadState.Unstarted: _uploaderThread.Start(); break; case ThreadState.Running: break; case ThreadState.Stopped: _uploaderThread = new Thread(PusherThread); _uploaderThread.Priority = ThreadPriority.Lowest; _uploaderThread.Name = "VoileOnlineUploader"; _uploaderThread.Start(); break; default: throw new NotImplementedException(String.Format("ThreadState: {0}", _uploaderThread.ThreadState)); } } private void PusherThread() { int numElements = 0; lock (_queue) { numElements = _queue.Count; } while (numElements > 0) { VoileOnlineTestPost voileOnlinePost; lock (_queue) { voileOnlinePost = _queue.Dequeue(); } string json = JsonConvert.SerializeObject(voileOnlinePost); DoPost(json); lock (_queue) { numElements = _queue.Count; } } } private void DoPost(string json) { } }