Domanda

Ciao ragazzi chiedo solo se qualcuno potesse aiutarmi a cercare di infilare la mia domanda in modo corretto, sono costantemente colpire un ostacolo dopo l'altro, non sono mai stato a clued sulla filettatura nelle applicazioni. Ho provato seguendo questo http://www.developerfusion.com/code/4654/ asincrono-HttpWebRequest / tutorial.

in fondo sto solo cercando di fermare la mia richiesta di appendere la mia domanda

public class Twitter
{
    private const string _username = "****",
        _password = "****";

    private WebResponse webResp;

    public string getTimeLine()
    {
        Thread thread = new Thread(new ThreadStart(TwitterRequestTimeLine));
        thread.IsBackground = true;
        thread.Start();

        using (Stream responseStream = webResp.GetResponseStream())
        {
            //
            using (StreamReader reader = new StreamReader(responseStream))
            {
                return reader.ReadToEnd();
            }
        }
    }

    private void TwitterRequestTimeLine()
    {
        string aUrl = "http://168.143.162.116/statuses/home_timeline.xml";
        HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(aUrl);
        SetRequestParams(request);  
        request.Credentials = new NetworkCredential(_username, _password);
        //WebResponse tempResp = request.GetResponse();
        ThreadState state = new ThreadState();
        IAsyncResult result = request.BeginGetResponse(new AsyncCallback(???), ???);

    }



      private static void SetRequestParams( HttpWebRequest request )
  {
      request.Timeout = 500000;
      request.Method = "POST";
      request.ContentType = "application/x-www-form-urlencoded";
      request.UserAgent = "AdverTwitment";
  }
}
}

chiunque aiuto sarebbe molto appricated

È stato utile?

Soluzione

Se questo è un app WinForms, il modo più semplice per mantenere la GUI reattivo durante l'esecuzione del WebRequest è quello di utilizzare un componente BackgroundWorker. Drop un BackgroundWorker sul modulo e chiamare il suo metodo RunWorkAsync (). Mettere il codice per eseguire il WebRequest e leggere la risposta nel gestore di eventi DoWork.

Altri suggerimenti

Davvero non c'è bisogno di infilare HttpWebRequest.

Quando si utilizza BeginGetResponse () e EndGetResponse () con HttpWebRequest, utilizza già un thread in background per voi al fine di lavorare in modo asincrono. Non v'è alcun motivo per spingere questo in un thread in background.

Per quanto riguarda l'uso: La Guida per la HttpWebRequest.BeginGetResponse dimostra una, richiesta asincrona completo.

Prova ad utilizzare un AsyncCallback come Rubens ha suggerito, ma hanno la richiamata automatica in un metodo separato per caricare i dati a destinazione. Se il metodo getTimeline non restituisce immediatamente causerà l'applicazione per appendere, perché il thread dell'interfaccia utente è ciò che è in esecuzione la richiesta stessa.

Se si utilizza un AsyncCallback separata di essere chiamato dopo che la richiesta è fatto e lo hanno caricare i dati, allora il metodo restituirà immediatamente e il tuo thread dell'interfaccia utente può fare altre cose durante l'attesa.

Che dire di questo:

private string getTimeLine()
{
    string responseValue = "";
    string aUrl = "http://168.143.162.116/statuses/home_timeline.xml";
    AutoResetEvent syncRequest = new AutoResetEvent(false);
    WebRequest request = WebRequest.Create(aUrl);
    request.Method = "POST";
    request.BeginGetResponse(getResponseResult =>
    {
        HttpWebResponse response = 
            (HttpWebResponse)request.EndGetResponse(getResponseResult);
        using (StreamReader reader = 
           new StreamReader(response.GetResponseStream()))
        {
            responseValue = reader.ReadToEnd();
        }

        syncRequest.Set();
    }, null);

    syncRequest.WaitOne();
    return responseValue;
}

Modifica : Ok, ho cercato di mantenere un metodo che restituisce una stringa, è per questo che ho usato AutoResetEvent; Se si utilizza un BackgroundWorker, potrai essere avvisato quando i dati siano disponibili:

BackgroundWorker worker = new BackgroundWorker();
string responseValue = "";
worker.RunWorkerCompleted += (sender, e) =>
{
    // update interface using responseValue variable
};
worker.DoWork += (sender, e) =>
{
    string aUrl = "http://168.143.162.116/statuses/home_timeline.xml";
    WebRequest request = WebRequest.Create(aUrl);
    // .. setup
    using(StreamReader reader = 
      new StreamReader(request.GetResponse().GetResponseStream()))
        responseValue = reader.ReadToEnd();
};
worker.RunWorkerAsync();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top