나는 이미 작업을 시작한 응용 프로그램을 가지고 있으며 약간의 것들을 재고 할 필요가있는 것으로 보인다. 응용 프로그램은 현재 winform 응용 프로그램입니다. 어쨌든, 사용자가 실행하고 싶은 스레드 수를 입력 할 수 있도록 허용합니다. 또한 사용자가 스레드 당 처리 할 레코드 수를 할당 할 수도 있습니다. 내가 한 일은 가변 수의 쓰레드를 반복하고 이에 따라 쓰레드를 생성하는 것입니다. 스레드에서 잠금을 수행하지 않고 있는지 여부를 확인할 필요가 없습니다. 나는 스레딩에 익숙하지 않고 여러 코어를 가지고 가능한 문제를 겪고 있습니다. 이 기능을 더 잘 수행 할 수있는 방법에 대한 조언이 필요합니다..NET 다중 스레드 도움말
스레드가 생성되기 전에 일부 레코드가 내 데이터베이스에서 처리되어 처리됩니다. 해당 목록 개체는 스레드로 보내지고 반복됩니다. 루프의 끝 부분에 도달하면 스레드는 데이터 함수를 호출하여 새로운 레코드를 가져 와서 목록에서 이전 레코드를 대체합니다. 더 이상의 레코드가 없어 질 때까지 계속됩니다. 여기 내 코드는 다음과 같습니다
private void CreateThreads()
{
_startTime = DateTime.Now;
var totalThreads = 0;
var totalRecords = 0;
progressThreadsCreated.Maximum = _threadCount;
progressThreadsCreated.Step = 1;
LabelThreadsCreated.Text = "0/" + _threadCount.ToString();
this.Update();
for(var i = 1; i <= _threadCount; i++)
{
LabelThreadsCreated.Text = i + "/" + _threadCount;
progressThreadsCreated.Value = i;
var adapter = new Dystopia.DataAdapter();
var records = adapter.FindAllWithLocking(_recordsPerThread,_validationId,_validationDateTime);
if(records != null && records.Count > 0)
{
totalThreads += 1;
LabelTotalProcesses.Text = "Total Processes Created: " + totalThreads.ToString();
var paramss = new ArrayList { i, records };
var thread = new Thread(new ParameterizedThreadStart(ThreadWorker));
thread.Start(paramss);
}
this.Update();
}
}
private void ThreadWorker(object paramList)
{
try
{
var parms = (ArrayList) paramList;
var stopThread = false;
var threadCount = (int) parms[0];
var records = (List<Candidates>) parms[1];
var runOnce = false;
var adapter = new Dystopia.DataAdapter();
var lastCount = records.Count;
var runningCount = 0;
while (_stopThreads == false)
{
if (!runOnce)
{
CreateProgressArea(threadCount, records.Count);
}
else
{
ResetProgressBarMethod(threadCount, records.Count);
}
runOnce = true;
var counter = 0;
if (records.Count > 0)
{
foreach (var record in records)
{
counter += 1;
runningCount += 1;
_totalRecords += 1;
var rec = record;
var proc = new ProcRecords();
proc.Validate(ref rec);
adapter.Update(rec);
UpdateProgressBarMethod(threadCount, counter, emails.Count, runningCount);
if (_stopThreads)
{
break;
}
}
UpdateProgressBarMethod(threadCount, -1, lastCount, runningCount);
if (!_noRecordsInPool)
{
records = adapter.FindAllWithLocking(_recordsPerThread, _validationId, _validationDateTime);
if (records == null || records.Count <= 0)
{
_noRecordsInPool = true;
break;
}
else
{
lastCount = records.Count;
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
당신이 겪고있는 문제는 무엇입니까? 또한 MessageBox.Show를 catch하는 예외에서 UI 스레드를 발생시켜야한다고 확신합니다. 귀하의 진행률 표시 줄이 당신이 이미이 일을하고 있는지 추측하고 있지만 여기에 아이디어에 대한 참조 질문이 있습니다 (http://stackoverflow.com/questions/2367718/c-automating-the-invokerequired-code-pattern). 이것 때문에 예외를 잃어 가고있는 것일까 요? –
대리자를 사용하여 UI를 업데이트하고 있습니다. 그건 잘 작동합니다. 그래도 의견에 감사드립니다. – DDiVita