4 messaggi dal 07 settembre 2010
ciao a tutti,
vorrei convertire il seguente blocco di codice:
foreach (DataRow DR in DtUrlToCheck.Rows)
{

try
{

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(DR["Component"].ToString());
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();



if (flagOK == "OK")
{
DtURLChecked.Rows.Add(new object[] { DR["ComponentDescription"].ToString(), DR["Component"].ToString(), webResponse.StatusCode.ToString(), "200" });
}
webResponse.Close();
webRequest.Abort();
}
catch (Exception ex)
{

if (ex.Message.ToString().Contains("(401)") )
{

if (flagOK=="OK")
{
DtURLChecked.Rows.Add(new object[] { DR["ComponentDescription"].ToString(), DR["Component"].ToString(), "OK-unauthorized", "401" });
}
}
else
{

DtURLChecked.Rows.Add(new object[] { DR["ComponentDescription"].ToString(), DR["Component"].ToString(), "KO", ex.Message });


}
}

}

in codice con elaborazione parallela,mediante l'utilizzo del 'PARALLEL.FOREACH'
ho provato un po' di soluzioni che qui non riporto per compattezza,ma mi da sempre errore di sintassi,qualcuno mi può indicare come tradurre?
grazie in anticipo
angelo
540 messaggi dal 24 maggio 2002
Contributi
Se il codice con ForEach funziona posta il codice con Parallel.ForEach per darti una mano sarebbe più utile.

Marco.
4 messaggi dal 07 settembre 2010
DataTable DtURLToCheck = new DataTable();
da.Fill(DtURLToCheck );

Parallel.ForEach(DtURLToCheck.Rows, DR =>
{
try
{

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(DR["Component"].ToString());
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();



if (flagOK == "OK")
{
DtURLChecked.Rows.Add(new object[] { DR["ComponentDescription"].ToString(), DR["Component"].ToString(), webResponse.StatusCode.ToString(), "200" });
}
webResponse.Close();
webRequest.Abort();
}
catch (Exception ex)
{

if (ex.Message.ToString().Contains("(401)") )
{

if (flagOK=="OK")
{
DtURLChecked.Rows.Add(new object[] { DR["ComponentDescription"].ToString(), DR["Component"].ToString(), "OK-unauthorized", "401" });
}
}
else
{

DtURLChecked.Rows.Add(new object[] { DR["ComponentDescription"].ToString(), DR["Component"].ToString(), "KO", ex.Message });


}
}

}
);
540 messaggi dal 24 maggio 2002
Contributi
A me dice che DtURLToCheck.Rows non può essere Castato esplicitamente a IEnumerable che sembra essere il tipo del primo valore passato.

Non so se è la causa di tutto, comunque ti suggerisco di ridurre il codice eseguito nel ciclo all'osso e poi procedere passo passo.

Marco.
Modificato da makbox il 24 settembre 2010 17.43 -
Sfortunatamente DataRowCollection non implementa l'interfaccia IEnumerable<> richiesta dal Parallel.ForEach, ma "solo" ICollection, IEnumerable.
Ovviare però è semplice:

Parallel.ForEach(DtUrlToCheck.Rows.Cast<DataRow>(), 
                 row => { /* le tue operazioni sulla singola row */ });

Davide Guida
Developer, Data Manager @ Publicis Healthware
http://davideguida.netne.net
55 messaggi dal 23 settembre 2003
importando il namespace System.Data e l'assembly System.Data.DataSetExtensions.dll si puó usare l'extension method "DataTable.AsEnumerable()"

Parallel.ForEach(DtUrlToCheck.AsEnumerable(), 
                 row => { /* le tue operazioni sulla singola row */ });


;)
4 messaggi dal 07 settembre 2010
grazie mille,un altra domanda :secondo voi nel codice che ho postato ha senso utilizzare un parallel.foreach..?potrebbe essere plausibile ??
grazie mille...
quanti core ha il tuo server? :D

Davide Guida
Developer, Data Manager @ Publicis Healthware
http://davideguida.netne.net

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
In primo piano

I più letti di oggi

Media
In evidenza
MISC