Bonjour,
J'aimerais avoir votre avis sur la question suivante :
Les deux codes suivants font-ils la même chose ? Plus concretement, est
qu'au finish, on arrive au même point.
NUMERO 1
TempTable = new DataTable();
TempTable = new DataTable();
NUMERO 2
TempTable = new DataTable();
TempTable= null;
TempTable = new DataTable();
Dans mon, appli, j'instancie la DataTable à chaque fois, avant de m'en
servir de variable de stockage pour une function en relation avec un serveur
Bloomberg. Cependant, il s'avère que si je ne met pas ma DataTable à null
avant de la réinstantier à nouveau (en gros, je fais du requetage vers
Bloomberg à plusieurs reprise dans un For, tout en réinstantiant la
DataTable), la function freeze et ne retourne rien. En placant un timeout à
15 minutes, la fonction prend fin et l'appli redemarre. Si je rajoute la
ligne du "null", la fonction ne freeze pas. Il s'avère que la Faq Bloomberg
explique ce details.
Mais je suis assez perplexe sur la nuance entre les deux codes.
Donc si un esprit éclairé pouvait m'aiguiller ^^
Un test tout simple permet de voir que le fait que le premier objet ne soit plus référencé par la variable le rend éligible pour le GC : class Class1 { private string str; Class1(string str) { this.str = str; } static void Main(string[] args) { Class1 c1 = new Class1("1"); c1 = new Class1("2"); GC.Collect(); Console.WriteLine("Après appel à GC"); Console.WriteLine(c1.ToString()); //Code quelconque histoire d'utiliser c1 } ~Class1() { Console.WriteLine("~Class1 : " + str); } }
Cependant, je n'ai pas encore eu le temps de regarder dans le détail l'exemple donné dans votre url, peut-être que dans des situations plus complexes il en est autrement; je regarderais ça plus attentivement ce soir.
--
Zazar
>> La variable existe encore, mais l'objet DataSet n'est plus référencé
et c'est ça qui compte.
Je suis d'accord. En théorie, c'est le comportement que j'attends mais
visiblement, la réalité semble être différente vu ce que rapporte Alex.
Je viens de tomber là-dessus, ce qui va dans le sens de ce que disais:
Un test tout simple permet de voir que le fait que le premier objet ne soit
plus référencé par la variable le rend éligible pour le GC :
class Class1 {
private string str;
Class1(string str) {
this.str = str;
}
static void Main(string[] args) {
Class1 c1 = new Class1("1");
c1 = new Class1("2");
GC.Collect();
Console.WriteLine("Après appel à GC");
Console.WriteLine(c1.ToString()); //Code quelconque histoire d'utiliser c1
}
~Class1() {
Console.WriteLine("~Class1 : " + str);
}
}
Cependant, je n'ai pas encore eu le temps de regarder dans le détail
l'exemple donné dans votre url, peut-être que dans des situations plus
complexes il en est autrement; je regarderais ça plus attentivement ce soir.
Un test tout simple permet de voir que le fait que le premier objet ne soit plus référencé par la variable le rend éligible pour le GC : class Class1 { private string str; Class1(string str) { this.str = str; } static void Main(string[] args) { Class1 c1 = new Class1("1"); c1 = new Class1("2"); GC.Collect(); Console.WriteLine("Après appel à GC"); Console.WriteLine(c1.ToString()); //Code quelconque histoire d'utiliser c1 } ~Class1() { Console.WriteLine("~Class1 : " + str); } }
Cependant, je n'ai pas encore eu le temps de regarder dans le détail l'exemple donné dans votre url, peut-être que dans des situations plus complexes il en est autrement; je regarderais ça plus attentivement ce soir.
--
Zazar
Zazar
Bonsoir,
Cependant, je n'ai pas encore eu le temps de regarder dans le détail l'exemple donné dans votre url, peut-être que dans des situations plus complexes il en est autrement; je regarderais ça plus attentivement ce soir.
Je viens de télécharger et de regarder le test référencé :
On a une classe qui possède un membre statique qui est une collection quelconque. Toutes les n secondes on appelle une méthode qui va
->mettre à null la variable en question ->créer une grosse collection et l'affecter à la variable
Puis on recommence le test en omettant l'affectation de null.
On ne peut pas en déduire qu'à chaque itération l' "objet précédent" n'est pas éligible tant qu'on n'est pas sortie de la portée de la variable (la variable étant statique elle a une durée de vie égale à celle de l'appdomain, hors les objets sont bien collectés par le ramasse miettes)
-- Zazar
Bonsoir,
Cependant, je n'ai pas encore eu le temps de regarder dans le détail
l'exemple donné dans votre url, peut-être que dans des situations plus
complexes il en est autrement; je regarderais ça plus attentivement
ce soir.
Je viens de télécharger et de regarder le test référencé :
On a une classe qui possède un membre statique qui est une collection
quelconque.
Toutes les n secondes on appelle une méthode qui va
->mettre à null la variable en question
->créer une grosse collection et l'affecter à la variable
Puis on recommence le test en omettant l'affectation de null.
On ne peut pas en déduire qu'à chaque itération l' "objet précédent" n'est
pas éligible tant qu'on n'est pas sortie de la portée de la variable (la
variable étant statique elle a une durée de vie égale à celle de
l'appdomain, hors les objets sont bien collectés par le ramasse miettes)
Cependant, je n'ai pas encore eu le temps de regarder dans le détail l'exemple donné dans votre url, peut-être que dans des situations plus complexes il en est autrement; je regarderais ça plus attentivement ce soir.
Je viens de télécharger et de regarder le test référencé :
On a une classe qui possède un membre statique qui est une collection quelconque. Toutes les n secondes on appelle une méthode qui va
->mettre à null la variable en question ->créer une grosse collection et l'affecter à la variable
Puis on recommence le test en omettant l'affectation de null.
On ne peut pas en déduire qu'à chaque itération l' "objet précédent" n'est pas éligible tant qu'on n'est pas sortie de la portée de la variable (la variable étant statique elle a une durée de vie égale à celle de l'appdomain, hors les objets sont bien collectés par le ramasse miettes)
-- Zazar
Zazar
> ********************************** Et dans la faq Bloomberg (en Vb), il y a ceci :
When performing synchronous data requests to Bloomberg, the Results parameter needs to be re-initialized after every call if the Subscribe or GetHistorical method is called consecutively or in a loop. If you are programming with Microsoft Visual Basic, for example, you could use the vbEmpty keyword or you could use the Erase function. Here is how the code might look:
Dim vtResult as Variant
For nLoop = 1 To 10 Blpdata1.Subscribe SecurityList, Cookie, Fields, Results:= vtResult ' ---------------------------- ' PROCESS DATA ' ---------------------------- vtResult = vbEmpty Next nLoop*************************************
Attention, ça c'est du code VB6, les processus de gestion de mémoire entre VB6 et .NET n'ont rien à voir! Je ne connais pas trop celui de VB6, peut-être qu'on n'est obligé de faire ça pour s'assurer que la mémoire est désallouée.
Sinon, quand à l'explication du freeze de votre procédure là je vois pas. Déjà je me pose la même question que Patrick Philippot quant à la nécessité d'instancier un nouveau DataSet alors qu'on ne va pas s'en servir. Le nom temp est-il imposé ? Avez-vous essayé de modifier votre code, en mettant un .Clear() à la place de l'affectation de null ? Quand ça freeze, ça le fait à quelle itération ? Ca freeze en mode debug et en mode release ? Que fait la fonction en question ? Avez-vous essayez de voir ce qui se passait pendant le freeze (boucle infine, attente d'un événement) ? Si vous n'utilisez aucun DataSet et que vous ignorez le retour de la fonction est-ce ça freeze aussi ?
Et de manière plus générale : c'est quoi BloomBerg ? Y a t-il un moyen de télécharger quelques composants afin de reproduire rapidement (et sans détruire une machine :)) votre environnement afin de tester votre code ?
-- Zazar
> **********************************
Et dans la faq Bloomberg (en Vb), il y a ceci :
When performing synchronous data requests to Bloomberg, the Results
parameter needs to be re-initialized after every call if the
Subscribe or GetHistorical method is called consecutively or in a
loop. If you are programming with Microsoft Visual Basic, for
example, you could use the vbEmpty keyword or you could use the Erase
function. Here is how the code might look:
Dim vtResult as Variant
For nLoop = 1 To 10
Blpdata1.Subscribe SecurityList, Cookie, Fields, Results:= vtResult
' ----------------------------
' PROCESS DATA
' ----------------------------
vtResult = vbEmpty
Next nLoop*************************************
Attention, ça c'est du code VB6, les processus de gestion de mémoire entre
VB6 et .NET n'ont rien à voir! Je ne connais pas trop celui de VB6,
peut-être qu'on n'est obligé de faire ça pour s'assurer que la mémoire est
désallouée.
Sinon, quand à l'explication du freeze de votre procédure là je vois pas.
Déjà je me pose la même question que Patrick Philippot quant à la nécessité
d'instancier un nouveau DataSet alors qu'on ne va pas s'en servir. Le nom
temp est-il imposé ? Avez-vous essayé de modifier votre code, en mettant un
.Clear() à la place de l'affectation de null ?
Quand ça freeze, ça le fait à quelle itération ? Ca freeze en mode debug et
en mode release ? Que fait la fonction en question ? Avez-vous essayez de
voir ce qui se passait pendant le freeze (boucle infine, attente d'un
événement) ? Si vous n'utilisez aucun DataSet et que vous ignorez le retour
de la fonction est-ce ça freeze aussi ?
Et de manière plus générale : c'est quoi BloomBerg ? Y a t-il un moyen de
télécharger quelques composants afin de reproduire rapidement (et sans
détruire une machine :)) votre environnement afin de tester votre code ?
> ********************************** Et dans la faq Bloomberg (en Vb), il y a ceci :
When performing synchronous data requests to Bloomberg, the Results parameter needs to be re-initialized after every call if the Subscribe or GetHistorical method is called consecutively or in a loop. If you are programming with Microsoft Visual Basic, for example, you could use the vbEmpty keyword or you could use the Erase function. Here is how the code might look:
Dim vtResult as Variant
For nLoop = 1 To 10 Blpdata1.Subscribe SecurityList, Cookie, Fields, Results:= vtResult ' ---------------------------- ' PROCESS DATA ' ---------------------------- vtResult = vbEmpty Next nLoop*************************************
Attention, ça c'est du code VB6, les processus de gestion de mémoire entre VB6 et .NET n'ont rien à voir! Je ne connais pas trop celui de VB6, peut-être qu'on n'est obligé de faire ça pour s'assurer que la mémoire est désallouée.
Sinon, quand à l'explication du freeze de votre procédure là je vois pas. Déjà je me pose la même question que Patrick Philippot quant à la nécessité d'instancier un nouveau DataSet alors qu'on ne va pas s'en servir. Le nom temp est-il imposé ? Avez-vous essayé de modifier votre code, en mettant un .Clear() à la place de l'affectation de null ? Quand ça freeze, ça le fait à quelle itération ? Ca freeze en mode debug et en mode release ? Que fait la fonction en question ? Avez-vous essayez de voir ce qui se passait pendant le freeze (boucle infine, attente d'un événement) ? Si vous n'utilisez aucun DataSet et que vous ignorez le retour de la fonction est-ce ça freeze aussi ?
Et de manière plus générale : c'est quoi BloomBerg ? Y a t-il un moyen de télécharger quelques composants afin de reproduire rapidement (et sans détruire une machine :)) votre environnement afin de tester votre code ?
-- Zazar
Mick
Bonjour, Voici la fonction
************** public DataTable GetSeveralHistoricalDataFromSeveralSecurity(string[] pSecurity,string[] Field,string DateStart,string DateEnd) { try { //Temporary DataTable which will store results values DataTable TempTable = new DataTable("Data"); DataColumn[] keys = new DataColumn[1]; TempTable.Columns.Add("Security"); keys[0] = TempTable.Columns[0]; TempTable.PrimaryKey = keys;
object StartDate = new object(); StartDate=Convert.ToDateTime(DateStart); object EndDate = new object(); EndDate=Convert.ToDateTime(DateEnd); object result=new object(); result =0; object BarSize=new object(); BarSize=Type.Missing; object BarFields=new object(); BarFields=Type.Missing; //BBobjConnect est un objet wrappé depuis la Dll fournit par BloomBerg et qui retourne les resultats.
BBobjConnect.GetHistoricalData(pSecurity,1,Field,StartDate,EndDate,BarSize,B arFields,out result); result BBobjConnect.get_BLPGetHistoricalData(pSecurity,Field,StartDate,EndDate,BarS ize,BarFields);
// Work with the returned data DataRow TempRow ; for(int i=0; i < pSecurity.Length; i++) { // Work with the returned data TempRow = TempTable.NewRow(); TempRow[0] = pSecurity[i]; TempTable.Rows.Add(TempRow); }
return TempTable; } catch { return null; } } *********** "Patrick Philippot" a écrit dans le message de news:OtB8bPw$
Mick wrote: > //LA JE REINSTANTIE MA DATATABLE > TempTable= new System.Data.DataTable("Temp"); > Log.TxtLog("Tentative de récupération du LastYear1 n°" + > Trial + " Date recherchée: " + LastYear + " - Nb Indices restants: " + > TempStockGroup2.Collection.Count); > try > { > //LA C LA PROCEDURE QUI FREEZE > TempTable > >
Je ne comprends pas: pourquoi faire un tempTable = new DatatTable alors que visiblement la méthode BBObj.GetSeveralHistoricalDataFromSeveralSecurity retourne une référence sur une DataTable qu'elle aura instancié elle-même?
Pas logique.
Pourrait-on voir la doc de cette méthode?
-- Patrick Philippot - Microsoft MVP MainSoft Consulting Services www.mainsoft.fr
Bonjour,
Voici la fonction
**************
public DataTable GetSeveralHistoricalDataFromSeveralSecurity(string[]
pSecurity,string[] Field,string DateStart,string DateEnd)
{
try
{
//Temporary DataTable which will store results values
DataTable TempTable = new DataTable("Data");
DataColumn[] keys = new DataColumn[1];
TempTable.Columns.Add("Security");
keys[0] = TempTable.Columns[0];
TempTable.PrimaryKey = keys;
object StartDate = new object();
StartDate=Convert.ToDateTime(DateStart);
object EndDate = new object();
EndDate=Convert.ToDateTime(DateEnd);
object result=new object();
result =0;
object BarSize=new object();
BarSize=Type.Missing;
object BarFields=new object();
BarFields=Type.Missing;
//BBobjConnect est un objet wrappé depuis la Dll fournit par BloomBerg et
qui retourne les resultats.
BBobjConnect.GetHistoricalData(pSecurity,1,Field,StartDate,EndDate,BarSize,B
arFields,out result);
result BBobjConnect.get_BLPGetHistoricalData(pSecurity,Field,StartDate,EndDate,BarS
ize,BarFields);
// Work with the returned data
DataRow TempRow ;
for(int i=0; i < pSecurity.Length; i++)
{
// Work with the returned data
TempRow = TempTable.NewRow();
TempRow[0] = pSecurity[i];
TempTable.Rows.Add(TempRow);
}
return TempTable;
}
catch
{
return null;
}
}
***********
"Patrick Philippot" <patrick.philippot@mainsoft.xx.fr> a écrit dans le
message de news:OtB8bPw$EHA.2012@TK2MSFTNGP15.phx.gbl...
Mick wrote:
> //LA JE REINSTANTIE MA DATATABLE
> TempTable= new System.Data.DataTable("Temp");
> Log.TxtLog("Tentative de récupération du LastYear1 n°" +
> Trial + " Date recherchée: " + LastYear + " - Nb Indices restants: " +
> TempStockGroup2.Collection.Count);
> try
> {
> //LA C LA PROCEDURE QUI FREEZE
> TempTable > >
Je ne comprends pas: pourquoi faire un tempTable = new DatatTable alors
que visiblement la méthode
BBObj.GetSeveralHistoricalDataFromSeveralSecurity retourne une référence
sur une DataTable qu'elle aura instancié elle-même?
Pas logique.
Pourrait-on voir la doc de cette méthode?
--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
object StartDate = new object(); StartDate=Convert.ToDateTime(DateStart); object EndDate = new object(); EndDate=Convert.ToDateTime(DateEnd); object result=new object(); result =0; object BarSize=new object(); BarSize=Type.Missing; object BarFields=new object(); BarFields=Type.Missing; //BBobjConnect est un objet wrappé depuis la Dll fournit par BloomBerg et qui retourne les resultats.
BBobjConnect.GetHistoricalData(pSecurity,1,Field,StartDate,EndDate,BarSize,B arFields,out result); result BBobjConnect.get_BLPGetHistoricalData(pSecurity,Field,StartDate,EndDate,BarS ize,BarFields);
// Work with the returned data DataRow TempRow ; for(int i=0; i < pSecurity.Length; i++) { // Work with the returned data TempRow = TempTable.NewRow(); TempRow[0] = pSecurity[i]; TempTable.Rows.Add(TempRow); }
return TempTable; } catch { return null; } } *********** "Patrick Philippot" a écrit dans le message de news:OtB8bPw$
Mick wrote: > //LA JE REINSTANTIE MA DATATABLE > TempTable= new System.Data.DataTable("Temp"); > Log.TxtLog("Tentative de récupération du LastYear1 n°" + > Trial + " Date recherchée: " + LastYear + " - Nb Indices restants: " + > TempStockGroup2.Collection.Count); > try > { > //LA C LA PROCEDURE QUI FREEZE > TempTable > >
Je ne comprends pas: pourquoi faire un tempTable = new DatatTable alors que visiblement la méthode BBObj.GetSeveralHistoricalDataFromSeveralSecurity retourne une référence sur une DataTable qu'elle aura instancié elle-même?
Pas logique.
Pourrait-on voir la doc de cette méthode?
-- Patrick Philippot - Microsoft MVP MainSoft Consulting Services www.mainsoft.fr
Patrick Philippot
Mick wrote:
Voici la fonction
************** public DataTable GetSeveralHistoricalDataFromSeveralSecurity(string[] pSecurity,string[] Field,string DateStart,string DateEnd)
Bonjour,
C'est bien ce que je disais: puisque cette fonction retourne une référence à une DataTable, pourquoi en allouez vous une instance vous-même? Faites simplement un
Dim tempTable As DataTable
puis tempTable = GetSeveralHistoricalDataFromSeveralSecurity
-- Patrick Philippot - Microsoft MVP MainSoft Consulting Services www.mainsoft.fr
Mick wrote:
Voici la fonction
**************
public DataTable GetSeveralHistoricalDataFromSeveralSecurity(string[]
pSecurity,string[] Field,string DateStart,string DateEnd)
Bonjour,
C'est bien ce que je disais: puisque cette fonction retourne une
référence à une DataTable, pourquoi en allouez vous une instance
vous-même? Faites simplement un
Dim tempTable As DataTable
puis tempTable = GetSeveralHistoricalDataFromSeveralSecurity
--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
************** public DataTable GetSeveralHistoricalDataFromSeveralSecurity(string[] pSecurity,string[] Field,string DateStart,string DateEnd)
Bonjour,
C'est bien ce que je disais: puisque cette fonction retourne une référence à une DataTable, pourquoi en allouez vous une instance vous-même? Faites simplement un
Dim tempTable As DataTable
puis tempTable = GetSeveralHistoricalDataFromSeveralSecurity
-- Patrick Philippot - Microsoft MVP MainSoft Consulting Services www.mainsoft.fr