gpt4 book ai didi

c# - .NET 多线程帮助

转载 作者:太空宇宙 更新时间:2023-11-03 18:47:00 27 4
gpt4 key购买 nike

我有一个已经开始使用的应用程序,看来我需要重新考虑一下。该应用程序目前是一个 winform 应用程序。无论如何,我允许用户输入他们想要运行的线程数。我还允许用户分配每个线程要处理的记录数。我所做的是遍历线程数变量并相应地创建线程。我没有对线程执行任何锁定(并且不确定我是否需要)。我是线程新手,遇到了多核问题。我需要一些关于如何使它表现更好的建议。

在创建线程之前,将从我的数据库中提取一些记录进行处理。该列表对象被发送到线程并循环执行。一旦到达循环的末尾,线程调用数据函数来提取一些新记录,替换列表中的旧记录。这一直持续到没有更多记录为止。这是我的代码:

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);
}
}

最佳答案

可以提高性能的简单方法是使用 ThreadPool管理您的线程创建。这允许操作系统分配一组线程来支付线程创建惩罚一次而不是多次。

如果您决定迁移到 .NET 4.0,Task这将是另一种方式。

关于c# - .NET 多线程帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3489979/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com