Here is my Code:
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;
}
here i am carrying out signing process in "ProcessFiles" method
Previously i used to use ".pfx" file to sign PDF/HTML files in 30 minutes. Now i forced to use certificate which is located on an e-token (attached to USB port), then the same process takes approx. 6 hours.
i am working on WPF/C# application
For HTML signing i have used Chilkat. For PDF signing i have used Itextsharp
any suggestion to speed up the process?