2009-12-23 50 views
0

嗨,大家只是想知道如果有人能夠幫助我嘗試並正確地線程我的應用程序,我不斷碰到一個接一個的障礙,我從來沒有在線程應用程序中線索。我試過了這個http://www.developerfusion.com/code/4654/asynchronous-httpwebrequest/教程。幫助HttpWebRquest在c#中的線程

基本上我只是想從我掛應用

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"; 
    } 
} 
} 

任何人的幫助停止我的要求將大大appricated

+0

這是一個Web應用程序或利用HTTP Web請求的客戶端應用程序嗎? – 2009-12-23 16:45:46

+0

請求是否真正起作用?它是否發送請求並收到回覆? – glenatron 2009-12-23 16:46:25

+0

是的,請求的作品我有一切工作,只是暫時吊死了一段時間的應用程序,直到它把所有的東西都還回來了。 另外它是一個桌面應用程序 – 2009-12-23 16:51:15

回答

2

如果這是一個WinForms應用程序,在執行WebRequest時保持GUI響應的最簡單方法是使用BackgroundWorker組件。在窗體上放一個BackgroundWorker並調用它的RunWorkAsync()方法。讓代碼執行WebRequest並在DoWork事件處理程序中讀取Response。

8

你真的不需要線程HttpWebRequest的。

當您在HttpWebRequest中使用BeginGetResponse()和EndGetResponse()時,它已經爲您使用後臺線程以便異步工作。沒有理由將其推入後臺線程。

至於用法:HttpWebRequest.BeginGetResponse的幫助演示了一個完整的異步請求。

-1

這個什麼:

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; 
} 

編輯:好吧,我試圖保持一個方法返回一個字符串,這就是爲什麼我用AutoResetEvent;如果使用BackgroundWorker,你就會收到通知時,您的數據是可用的:

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(); 
+0

我試過了,它似乎更快,但它似乎仍然導致我的應用程序掛起並顯示「沒有響應」 – 2009-12-23 17:03:51

+1

這只是在異步調用中包裝異步調用,以使其同步。 – Stephan 2009-12-23 17:06:18

+0

我正在嘗試編輯後的版本,並對不起,如果我錯過了這裏顯而易見的,但我怎麼會發送回來更新不同形式的richtextbox?對不起,再次猜測花了很多時間在今天盯着代碼 – 2009-12-23 18:07:24

0

嘗試使用一個AsyncCallback像魯本斯建議,但有回調要求成爲一個單獨的方法將數據加載到其目的地。如果getTimeline方法沒有立即返回,它將導致應用程序掛起,因爲UI線程是運行請求本身的東西。

如果您在請求完成並使其加載數據後使用單獨的AsyncCallback,那麼該方法將立即返回,並且您的UI線程可以在等待時執行其他操作。