2011-12-15 4 views
0

行われるので、私は、ユーザーがボタンを押す私のメインクラス、のisntanceにHTTPリクエストは、HTTP呼び出しまでテキストボックスの更新を一時停止すると、WP7

を作る方法callを持つクラスrequestを持っていますクラスreqが作成され、メソッドcallがhttp要求を呼び出す。

私は、ボタンのクリックイベントハンドラメソッドでそれを入れてみました、私は結果

と私のテキストブロックを更新できるように呼び出しが行われたときに知っている特定の方法を持っていると思います:

 req.call(textBox1.Text); 
     Dispatcher.BeginInvoke(() => 
     { 
      //req is the class instance, outputMessage is the string holds 
      //the result of the http request 
      //resultTextBlock is the one I wanna update with the result 
      while (req.outputMessage == "none") ; 
      resultTextBlock.Text = req.outputMessage; 
     }); 
ボタンのクリックイベントハンドラで

が、その後アプリは無限ループに入り、終了したことがない、httpリクエストは、それが問題

だ場合、私はresultTextBlockいつでも更新できるようにしたい行われる第2の割合を取りますレスultがつかまえられる。

答えて

1

要求が完了すると、その要求からコールバックが必要です。これはWebClientによって、すなわちサポートされています。

using (WebClient wc = new WebClient()) 
{ 
    wc.DownloadStringAsync(new Uri("http://stackoverflow.com"), null); 
    wc.DownloadStringCompleted += (s, e) => 
    { 
     string outputMessage = e.Result; 
     Dispatcher.BeginInvoke(() => 
     { 
       resultTextBlock.Text = outputMessage; 

     }); 
    }; 
} 

編集:

あなたは結果の文字列は(も命名ガイドラインに注意し、すべて大文字でなければなりません渡すあなたreqクラスにデリゲートに渡すことができます

public void Call(string url, Action<string> notifyCompletion) 
{ 

//once completed: 
    notifyCompletion(result); 
} 

およびに呼び出し元のコードを変更します:)ので、次のようにメソッドシグネチャを変更

Req myRequest = new Req(); 
myRequest.Call(textBox1.Text, s => 
{ 
    Dispatcher.BeginInvoke(() => 
    { 
     resultTextBlock.Text = outputMessage; 
    }); 
}); 
+0

問題は、呼び出しがメインクラスとは別の別のクラスで実装されているため、resultTextBlockを – SKandeel

+0

に割り当てることができないため、デリゲートを 'request'クラスの第2引数として渡すことができます。完了したイベントハンドラで – BrokenGlass

+0

ありがとうございます、それは動作します – SKandeel

関連する問題