메시지 전송 횟수를 제한하기 위해 스로틀을 설정하는 중입니다. 이 방법이 효과가 있긴하지만, 더 좋은 방법이 있다면 호기심이 있습니까? 모든 조언을 부탁드립니다.코드 검토 (멀티 스레딩시 첫 번째 시도)
public Class MyApp
{
private long _messagesSent;
private long _totalMessagesSent;
public int NumberOfMessages { get; set; }
public int MessagesPerSecond { get; set; }
public void SendMessage()
{
ThreadholdMonitor.Start();
for (var i = 0; i < NumberOfMessages; i++) {
// Code here...
if (MessagesPerSecond <= _messagesSent) {
ThreadholdMonitor.StopSendingEvent.Set();
lock (this) {
var hasPrinted = false;
while (ThreadholdMonitor.StopSendingEvent.WaitOne(0, false)) {
if (hasPrinted == false) {
Console.WriteLine("Sent " + _messagesSent + " messages");
hasPrinted = true;
}
Interlocked.Exchange(ref _messagesSent, 0);
}
}
}
SendMessage(details);
Interlocked.Increment(ref _messagesSent);
Interlocked.Increment(ref _totalMessagesSent);
}
ThreadholdMonitor.Stop();
}
}
public class ThreadholdMonitor
{
private static ManualResetEvent _monitorEvent;
public static ManualResetEvent StopSendingEvent { get; set; }
public static void Start()
{
_monitorEvent = new ManualResetEvent(false);
StopSendingEvent = new ManualResetEvent(false);
Thread monitorThread = new Thread(new ThreadStart(ControlSharedSignal));
monitorThread.Start();
}
public static void Stop()
{
_monitorEvent.Set();
}
private static void ControlSharedSignal()
{
var startTime = DateTime.Now;
while (_monitorEvent.WaitOne(0, false) == false) {
if (DateTime.Now.Subtract(startTime).Seconds >= 1) {
StopSendingEvent.Reset();
startTime = DateTime.Now;
}
}
}
}
코드가 너무 많고 주석이 충분하지 않습니다. 이 코드가 무엇을하려하는지 설명하십시오. –
말도 안돼, 당신은 코멘트가 필요하지 않습니다. 하지만 코드를 읽지 않고 이해할 수 있으면 코드를 읽고 이해할 수 있어야합니다. 어쨌든 당신이 가져야 할 것입니다. –
읽을 수 없다면 사과드립니다. 첫 번째 시도였습니다. :( – Ryan