Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    18

    [c#]WaitHandle,WaitAll()\

    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.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    18
    Ragazzi, ancora nessuna nuova??

    Ho provato a cambiare
    if (WaitHandle.WaitAll(wh.ToArray(), -1))
    in
    codice:
    While(WaitHandle.WaitAll(wh.ToArray(), -1)
    ma senza alcun risultato, non cambia nulla.

    Ad ogni chiamata aggiorno una tabella nel nodo che la riceve, ma se la richiesta viene fatta a due nodi differenti, una delle tabelle non viene aggiornata come se non ricevesse la richiesta. mentre se eseguo con il debug, la tabella viene regolarmente aggiornata.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    18
    Ho risolto il problema 1)
    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.
    aggirando l'ostacolo, ho messo uno sleep dopo ogni invio adesso è ok.

    Rimane il problema 2 non posso andare oltre due chiamate consecutive.

    AIUTATEMI!!!!!


  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    18
    Ciao a tutti,

    riesumo questo vecchio post solo adesso, perchè ho lavorato ad altro in questi giorni.
    Ho ripreso adesso il lavoro a questo progetto e il problema è ancora senza soluzione.
    Sapreste dirmi qualcosa?
    E' possibile che il motivo sia dovuto a IIS, in quanto simulo la distribuzione dei nodi solla stessa macchina cambiando l'indirizzo dei webservices ad es.: http://localhost/SRnode/WS.asmx, http://localhost/SRnode1/WS.asmx, ecc...

  5. #5
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    Sinceramente non ho capito cosa deve fare questo web service e non ho capito perchè utilizzi chiamate asincrone dentro all'webservice
    I got the remedy

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    18
    Sinceramente non ho capito cosa deve fare questo web service
    Il WebMethod effettua la ricerca di informazioni sul db locale e mette i ris di tale ricerca in un dataset, poi inoltra la richiesta ai suoi vicini. I quali, a loro volta, effettuano la ricerca sui loro db locali mettendo i ris della ricerca sempre nel dataset MyQuery. Quando il valore timeToLiveReq diventa negativo, la richiesta non viene inoltrata ulteriormente e il metodo restituisce MyQuery al chiamante che colleziona la risp dal nodo chiamato con quanto già presente sul suo dataset MyQuey con il metodo Merge().

    e non ho capito perchè utilizzi chiamate asincrone dentro all'webservice
    Utilizzo le chiamate asincrone perchè in questo modo mando tutte le richieste contemporaneamente ai miei vicini, alla fine attendo tutte le risp.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    18
    Ragazzi ho notato che il problema si presenta anche se richiamo il webmethod in maniera sincrona.

    Cioè questa è la topoplogia della rete (semplicissima):


    I nodi sono simulati come siti web all'interno di IIS7, ogni nodo ha un db locale contente le informazioni da ricercare e i nodi contengono webservice uguali(espongono gli stessi webmethod).
    Un client collegato al servizio che espone WebMethod RunSearch fa iniziare la ricerca sul DB locale di SRNode e invia una richiesta di ricerca sul nodo SRnode1 richiamando RunSearch, di questo nodo che è identico a quello presente su SRnode, a sua volta esso inoltra la richiesta su SRnode2 che non appena inoltra la richiesta su SRnode3 fa piantare l'esecuzione.

    Eseguendo con il debug vedo la stessa cosa, la richiesta (sincorna) inoltrata a SRnode3 non fa partire il debug sul codice di questo nodo e il debug non va avanti. L'interfaccia del client si blocca con la fatica scritta (Non risponde) e dopo un po di tempo viene solevata una TimeoutException.

    Spero di essere stato un pò più chiaro
    Grazie per l'attenzione e scusate l'insistenza.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.