- PR -

コールバック手法の非同期WebService コールバックメソッド内でフォームのコントロールへのアクセス方法が

投稿者投稿内容
Tanishi
会議室デビュー日: 2006/03/11
投稿数: 9
投稿日時: 2006-03-17 11:50
なんとか、処理を実現できました!!

CallBackメソッドをstaticにしていたのが問題でした。

デリゲート作成時に、test.WebForm1.TestCallBack じゃなく、おとなしくインスタンスされている this.TestCallBack を渡せばよかったんですね・・・・。
(コールバックメソッドはstaticじゃなければ駄目だと思い込んでいました)

それと、CallBackメソッド内でも、キャストが間違っていたりしました。

みなさま、多くのご返答ありがとうございます!
すごく勉強になりました!

以下に修正コードを載せます。

class Test
{
.
.
.
.


private void Button1_Click(object sender, System.EventArgs e)
{
localhost.Service1 s = new localhost.Service1();

System.AsyncCallback cb = new AsyncCallback(this.TestCallBack);

System.IAsyncResult ar = s.BeginHelloWorld(cb,s);


while(!ar.IsCompleted)
{
//なんらかの処理
}
}

public void TestCallBack(System.IAsyncResult ar)
{
localhost.Service1 sr = (localhost.Service1)ar.AsyncState;
this.TextBox1.Text = sr.EndHelloWorld(ar);
}
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-03-17 16:05
ん〜どうかなぁ。
確かに呼んでくれるでしょうが、何か変な感じになりそうですね。

while(!ar.IsCompleted)
{
//なんらかの処理
}

の「なんらかの処理」に時間を食っているから、たまたまクライアントにレスポンスを返す前にコールバックメソッドが呼ばれて、テキストボックスに値を書けているだけのような…。

# あ、いいのか。だからワザと待っているんですね。
_________________
囚人@わんくま同盟
囚人のジレンマな日々

[ メッセージ編集済み 編集者: 囚人 編集日時 2006-03-17 16:13 ]
Tanishi
会議室デビュー日: 2006/03/11
投稿数: 9
投稿日時: 2006-03-17 18:14
囚人さん

なるほど・・・・セオリーからはちょっと外れた処理なわけですね。

レスポンスを返す前に、コールバックされるから、クライアントに返る・・・・

ごもっともな事実ですが、そのような細かい視点で考えていませんでした。

漠然と「待ってりゃいいや」という考えで・・・(だったら同期にしろってことか!)

そのような細かい視点をこれから身につけたいですね。

でも、この処理のコードを書こうとするなかで、いろいろ得るものがありました。

今度はAjaxの非同期通信を研究するぞ!!

囚人さん、いろいろご指摘ありがとうございます!

[ メッセージ編集済み 編集者: Tanishi 編集日時 2006-03-17 18:20 ]

スキルアップ/キャリアアップ(JOB@IT)