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 をスレッド化する必要はありません。

HttpWebRequest で BeginGetResponse() と EndGetResponse() を使用すると、非同期で動作するために既にバックグラウンド スレッドが使用されます。これをバックグラウンド スレッドにプッシュする理由はありません。

使用法について: HttpWebRequest.BeginGetResponseのヘルプは、完全な非同期要求を示しています。

于 2009-12-23T16:47:06.420 に答える
2

これがWinFormsアプリの場合、WebRequestの実行中にGUIの応答性を維持する最も簡単な方法は、BackgroundWorkerコンポーネントを使用することです。フォームにBackgroundWorkerをドロップし、そのRunWorkAsync()メソッドを呼び出します。WebRequestを実行するコードを配置し、DoWorkイベントハンドラーでResponseを読み取ります。

于 2009-12-23T17:29:37.257 に答える
0

ルーベンスが提案したように 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 に答える