Hallo,
Herr Julius hat schon eine Reihe von Emails mit ähnlichen Problemen von mir bekommen, um ihn zu entlasten schreib ich jetzt mal ins Forum
Ich habe eine Liste mit FStammInfo Objekten (Class ist wie IStammInfo Class, nur Serializable).
Für jedes dieser Objekte möchte ich IStamminformationen. Da ein sequentieller Aufruf von mehreren tausend IStamminformationen ewig dauert, spalte ich die Arbeit mittels TPL in Threads auf.
Das funktioniert gut für eine kleine Anzahl an Objekten. Bei einer größeren Anzahl bekomme ich jedoch für mehr als die Hälfte keine IStamminformationen zurück (stammInformationen.SymbolNr = 0).
Momentan sammle ich diese Symbolnummern (in concurrentBagEmptyStammInformationen) und probiere es nacher noch einmal (insgesamt 5 Versuche). Jeder weitere Versuch ist wiederum teilweise erfolgreich, so dass sich die Anzahl an "leeren" Objekten verringert - trotzdem:
Warum bekomme ich für mehr als die Hälfte von Abfragen keine Stimminformationen zurück?
Ist der COM Server überlastet? Wenn ja, würde ein Thread.Sleep(200) vor jeder Interface Abfrage helfen?
Oder soll ich IStamminformationen stammInformationen global definieren um nicht jedesmal neu zu instanzieren?
Hier der entsprechende Code:
Code:public static List<FZertifikat> GetFZertifikateListFromStammInfoList(List<FStammInfo> fStammInfos)
{
var concurrentBagOfFZertis = new ConcurrentBag<FZertifikat>();
var concurrentBagEmptyStammInformationen = new ConcurrentBag<FStammInfo>();
int cnt = 0;
Console.WriteLine("Start creating Zertifikate List from StammInfo...");
while (cnt++ < 5)
{
Parallel.ForEach(fStammInfos, (fStammInfo) =>
{
var fZertifikat = FillStamminformationen(fStammInfo);
if (fZertifikat != null && fZertifikat.SymbolNr > 0)
{
concurrentBagOfFZertis.Add(fZertifikat);
}
else
{
concurrentBagEmptyStammInformationen.Add(fStammInfo);
}
});
if (concurrentBagEmptyStammInformationen.Count == 0)
{
break;
}
fStammInfos.Clear();
fStammInfos = concurrentBagEmptyStammInformationen.ToList();
concurrentBagEmptyStammInformationen = new ConcurrentBag<FStammInfo>();
Console.WriteLine("NULL or failed Values left after Run: " + fStammInfos.Count);
}
Console.WriteLine("Zertifikate List from StammInfo List retrieved!");
return concurrentBagOfFZertis.ToList();
}
private static FZertifikat FillStamminformationen(FStammInfo fStammInfo)
{
IStamminformationen stammInformationen = new StamminformationenClass();
stammInformationen.SymbolNr = fStammInfo.SymbolNr;
var fZertifikat = ZertifikateManager.GetFZertifikateFromStammInformationen(stammInformationen, fStammInfo);
stammInformationen = null;
return fZertifikat;
}