J'ai une application avec laquelle j'ai déjà commencé à travailler et il me semble que j'ai besoin de repenser un peu les choses. L'application est une application winform pour le moment. Quoi qu'il en soit, je permets à l'utilisateur d'entrer le nombre de threads qu'ils aimeraient avoir en cours d'exécution. J'autorise également l'utilisateur à allouer le nombre d'enregistrements à traiter par thread. Ce que j'ai fait est de faire une boucle sur le nombre de threads variables et de créer les threads en conséquence. Je n'effectue aucun verrouillage (et je ne suis pas sûr d'en avoir besoin ou pas) sur les threads. Je suis novice en matière de threading et je suis confronté à un problème possible avec plusieurs cœurs. J'ai besoin de conseils sur la façon dont je peux améliorer cette performance.Aide .NET multithread
Avant de créer un thread, certains enregistrements sont extraits de ma base de données pour être traités. Cet objet liste est envoyé au thread et bouclé. Une fois qu'il atteint la fin de la boucle, le thread appelle les fonctions de données pour récupérer de nouveaux enregistrements, en remplaçant les anciens dans la liste. Cela continue jusqu'à ce qu'il n'y ait plus d'enregistrements. Voici mon code:
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);
}
}
Quels sont les problèmes que vous rencontrez? En outre, je suis assez sûr que vous devez augmenter le thread d'interface utilisateur dans votre exception capture MessageBox.Show. Je suppose que si votre barre de progression fonctionne, vous le faites déjà, mais voici une question de référence de l'idée (http://stackoverflow.com/questions/2367718/c-automating-the-invokerequired-code-pattern). Peut-être que vous perdez vos exceptions à cause de cela? –
J'utilise des délégués pour mettre à jour l'interface utilisateur. Cela fonctionne bien. Merci pour les commentaires, cependant. – DDiVita