Для ускорения процесса цифровой подписи в многопоточном приложении в WPF C#
Вот мой код:
int ThreadCount = FilteredViewTable.Count;
int chunksize = ThreadCount + 1;
int lastbatch = 0;
int batchCount = 0;
if (ThreadCount > chunksize)
{
batchCount = ThreadCount / chunksize;
lastbatch = ThreadCount % chunksize;
}
else
lastbatch = ThreadCount;
if (lastbatch > 0)
batchCount++;
int endThread = 0;
int counter = 0;
while (counter < batchCount)
{
int StartPos = counter == 0 ? 0 : (endThread * counter);
counter++;
if (counter == batchCount && lastbatch != 0)
endThread = lastbatch;
else
endThread = chunksize;
int EndPos = endThread;
ObservableCollection<ManualSendingData> dtTempFilteredData = new ObservableCollection<ManualSendingData>();
mnThreadCount = 1;
Int32 lnRowCount = 0;
Decimal RowsPerThread = 0;
Array.Resize(ref moProcessFilesThreads, mnThreadCount);
Array.Resize(ref moDataTables, mnThreadCount);
Array.Resize(ref moEmailThreadsErrors, mnThreadCount);
Array.Resize(ref mcThreadsErrors, mnThreadCount);
Array.Resize(ref mnMailCount, mnThreadCount);
RowsPerThread = Math.Round(Convert.ToDecimal(endThread / GlobalStatic.gcThreads), 0);
List<ManualSendingData> lo = FilteredViewTable.Skip(StartPos).Take(endThread).ToList();
foreach (ManualSendingData drRow in lo)
{
lnRowCount += 1;
moMainDataTable.Where(item => item.ClientCode == drRow.ClientCode).ToList().ForEach((DataItem) =>
{
dtTempFilteredData.Add(DataItem);
});
if (lnRowCount == RowsPerThread)
{
Array.Resize(ref moProcessFilesThreads, mnThreadCount);
Array.Resize(ref moDataTables, mnThreadCount);
Array.Resize(ref moEmailThreadsErrors, mnThreadCount);
Array.Resize(ref mcThreadsErrors, mnThreadCount);
Array.Resize(ref mnMailCount, mnThreadCount);
moDataTables[mnThreadCount - 1] = new ObservableCollection<ManualSendingData>();
moDataTables[mnThreadCount - 1] = new ObservableCollection<ManualSendingData>(dtTempFilteredData);
mnMailCount[mnThreadCount - 1] = Convert.ToInt32(dtTempFilteredData.Count);
moProcessFilesThreads[mnThreadCount - 1] = new Thread(new ParameterizedThreadStart(ProcessFiles));
moProcessFilesThreads[mnThreadCount - 1].Name = (mnThreadCount - 1).ToString();
moProcessFilesThreads[mnThreadCount - 1].Start((object)dtTempFilteredData);
lnRowCount = 0;
mnThreadCount += 1;
dtTempFilteredData = new ObservableCollection<ManualSendingData>();
}
}
List<int> CompletedThreads = new List<int>();
int inTableCount = 0;
int inRowCount = 0;
}
здесь я выполняю процесс подписания в методе "ProcessFiles"
Ранее я использовал файл ".pfx" для подписи файлов PDF/HTML за 30 минут. Теперь я вынужден использовать сертификат, который находится на e-токене (подключен к USB-порту), затем тот же процесс занимает ок. 6 часов.
я работаю над приложением WPF/C#
Для подписи HTML я использовал Chilkat. Для подписи в PDF я использовал Itextsharp
Любое предложение ускорить процесс?