다음 코드는 작동하지만 매우 더럽습니다. 사실 코드는 내가 추가 한 부분을 제외하고는 괜찮습니다. 일시 중지 및 중지 버튼입니다. 나는 C#에 익숙하지 않으므로 어떤 도움도받을 가치가 없다.스레드 일시 중지 및 중지
private void pause_button_Click(object sender, EventArgs e)
{
start = false; pause = true; stop = false;
guiUpdate();
PauseEvent.Reset();
}
private void stop_button_Click(object sender, EventArgs e)
{
if (pause == true)
{
PauseEvent.Set();
pause = false;
this.start_button.Click -= new System.EventHandler(this.resume_button_Click);
}
start = false; stop = true;
}
private int activeThreads = 0;
private Thread thread;
private void DoWork(object sender)
{
string line = null;
ereader = new StreamReader(MY_LIST);
do
{
lock (ereader)
{
PauseEvent.WaitOne();
line = ereader.ReadLine();
}
//
//other commands for processing & building the argument
//
lock (signal)
{
++activeThreads;
}
thread = new Thread(new ParameterizedThreadStart(
o =>
{
processit((object)o);
lock (signal)
{
--activeThreads;
Monitor.Pulse(signal);
}
}));
thread.Start(argument);
lock (signal)
{
while (activeThreads > maxthreads)
Monitor.Wait(signal);
}
lock (signal)
{
if (!start)
{
showwaiting(true);//shows an animated gif with a "please wait" msg
while (activeThreads > 0)
Monitor.Wait(signal);
showwaiting(false);
if (stop == true)
{
this._BackgroundWorker.CancelAsync();
break;
}
}
}
}
while (ereader.Peek() != -1);
showwaiting(true);
lock (signal)
{
while (activeThreads > 0)
Monitor.Wait(signal);
}
showwaiting(false);
}
private void _BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
start = false; stop = true;
guiUpdate();
}
정확히 내가 내부 및 루프 외부에서 이러한 중복 명령을 피하기 위해 무엇을 할 수 있는가?
'if (pause == true)',''if (pause)'로 충분하지 않습니다. 그리고 다음과 같이 "paused"라고 이름을 짓고 앞면에 "is"를 추가 할 수 있습니다. 여전히 의미가 있습니다. 이 코드는 약간의 깔끔함이 필요합니다. showwaiting 호출을 제어하기 위해 이벤트 사용을 고려해야합니다. –
또한 모든 bool 변수를 단일 enum으로 변경한다고 생각합니다. 아마도'Start','Paused','Stop'과 같은 상수가있을 것입니다. 그렇게하면 오직 하나의 상태가있을 수 있으며 상태를 변경할 다른 변수를 기억할 필요가 없습니다. –
고마워요,하지만 중복 된 activethreads 루프를 제거하는 방법을 알고 있습니까? –