Ciao a tutti,
rieccomi di nuovo con un altro problema. cerco di spiegarmi non so se ci riuscirò.
Brevemente il mio problema è che:
1) il Waithandle.WaitAll() alla fine, sembra prorpio non aspettare nulla, ovvero se mando 2 richieste BeginInvoke(....) e poi aspetto ottego ris solo da una richiesta, mentre invece se eseguo lo stesso codice con il debug le risposte arrivano da entrambi.
2) riesco ad inoltrare (richiamare asincronamente questo stesso webmethod su altri server) solo per 2 volte, al terzo WaitHandle.WaitAll(), il programma si pianta ritornando una timeoutexception, e proseguendo dopo passa all'esecuzione della 3 chiamata.
codice:
[WebMethod]
public DataSet RunSearch(String Key, String sourceAddr, DateTime t, int timeToLiveReq, String[] nodes)
{
DataSet MyQuery = new DataSet();
String connString = cs.ConnectionString;
SqlConnection conn = new SqlConnection(connString);
try
{
if (IsNewRequest(sourceAddr, t))
{
MyQuery = LocalSearch(Key);
conn.Open();
//cerco i vicini dalla mia tab neighborhood
SqlCommand myCommand = new SqlCommand("SELECT * FROM Vicini", conn);
SqlDataReader myReader = myCommand.ExecuteReader();
timeToLiveReq--; //ttl restante per la richiesta
String delim = " \n";
if (timeToLiveReq >= 0)
{
nodes[timeToLiveReq] = HttpContext.Current.Request.Url.AbsoluteUri.ToString();//Nodi attraversati
List<String> t_nodes=nodes.ToList<String>();
List<IAsyncResult> aResults = new List<IAsyncResult>();
List<WaitHandle> wh = new List<WaitHandle>();
runsearchDelegate = new RunSearchDeleg(remoteservice.RunSearch);
while (myReader.Read())//scandisce i risultati della query dei vicini
{
remoteservice.Url = myReader["vicino"].ToString().Trim(delim.ToCharArray())+"/WS.asmx";
if (!t_nodes.Contains(remoteservice.Url.ToString()))//non mando la richiesta se presente
{
IAsyncResult ar = runsearchDelegate.BeginInvoke(Key, sourceAddr, t, timeToLiveReq, nodes, null, new object());
aResults.Add(ar);
wh.Add(ar.AsyncWaitHandle);
}
}
myReader.Close();
if (wh.Count != 0)
{
if (WaitHandle.WaitAll(wh.ToArray(), -1))//Aspetto tutte le richieste
{
foreach (IAsyncResult res in aResults)
{
DataSet ds = runsearchDelegate.EndInvoke(res);
MyQuery.Merge(ds);//accumula i ds delle varie chiamate
}
}
}
}
}
}
catch (SoapException ex)
{
throw ex;
}
catch (System.ServiceModel.EndpointNotFoundException ex)
{
throw ex;
}
catch (Exception e)
{
conn.Close();
throw e;
}
conn.Close();
return MyQuery;//finisce e restituisce le myquery
}
Sono nei guai dovrei consegnare questo elaborato per giovedì e ancora sono in alto mare vi prego aiutatemi.