0

大家好,只是想知道是否有人可以帮助我尝试正确地线程化我的应用程序,我不断遇到一个又一个的障碍,我从来没有对应用程序中的线程化有所了解。我已尝试遵循此http://www.developerfusion.com/code/4654/asynchronous-httpwebrequest/教程。

基本上我只是想阻止我的请求挂起我的应用程序

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

任何人的帮助都会非常感激

4

4 回答 4

8

你真的不需要线程 HttpWebRequest。

当您将 BeginGetResponse() 和 EndGetResponse() 与 HttpWebRequest 一起使用时,它已经为您使用了一个后台线程以便异步工作。没有理由将其推送到后台线程中。

至于用法:HttpWebRequest.BeginGetResponse的帮助演示了一个完整的异步请求。

于 2009-12-23T16:47:06.420 回答
2

如果这是一个 WinForms 应用程序,在执行 WebRequest 时保持 GUI 响应的最简单方法是使用 BackgroundWorker 组件。在表单上放置一个 BackgroundWorker 并调用它的 RunWorkAsync() 方法。将执行 WebRequest 的代码放入 DoWork 事件处理程序中并读取响应。

于 2009-12-23T17:29:37.257 回答
0

尝试像 Rubens 建议的那样使用 AsyncCallback,但将回调调用到单独的方法中以将数据加载到其目的地。如果 getTimeline 方法没有立即返回,它将导致应用程序挂起,因为 UI 线程本身就是运行请求的对象。

如果您在请求完成后使用单独的 AsyncCallback 调用并让它加载数据,那么该方法将立即返回,并且您的 UI 线程可以在等待时执行其他操作。

于 2009-12-23T17:10:10.300 回答
-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();
于 2009-12-23T16:52:12.067 回答