1

ASP.NET 4.0 WEBFORMS を実行しています

この問題は私を悩ませます...私はSOとMSDNのいくつかのスレッドを読んだことがありますが、この非同期パズルの最後のピースが欠けていると思います....

私が達成したいのは、ボタンとラベルを設定したテストとして、ラベルを非同期的に更新することです。次に、ループが7以上の数値にヒットするたびに0から9までカウントするループがあり、その数値でラベルを更新したいと考えています。

これを同期的に動作させるようにしましたが、ラベルには最後の番号のみが表示されます。すべてのメソッドをセットアップしてイベントを接続しましたが、beginInvoke と asyncresult を使用しても更新されません。

現時点ではまったく更新されていません。多くのテストを行った結果、振り出しに戻りましたか? 私はそれを更新することができました.system.threading.thread.sleep(3000)を試して、すぐに更新されたかどうかを確認しましたが、まったく機能しませんでしたか?

これを達成する方法について誰かがヒントを得たのは困惑していますか?

これが私のコードです

最初の私のカウンタークラス

public class counter
{
public static event numberHandler FoundNumber;
public delegate void numberHandler(string position);

public void theAscendator()
{
    for (int i = 0; i < 10; i++)
    {
        if (i >= 7)
        {
            string labelText = i.ToString();

            if(FoundNumber != null)
            {
                FoundNumber.BeginInvoke(labelText, new AsyncCallback(this.SevenAndOver),null);                 
            }
        }
    }
}

public void SevenAndOver(IAsyncResult ar)
{
    FoundNumber.EndInvoke(ar);

} 

}

今私のメインページ(index.aspx)コードビハインド

public partial class index : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
private void index_FoundNumber(string position)
{

 //   Response.Write(position);

    Label1.Text = position;

    //   throw new NotImplementedException();
}
protected void Button1_Click(object sender, EventArgs e)
{
    counter counterClass = new counter();
    counterClass.theAscendator();        
    counter.FoundNumber += new counter.numberHandler(index_FoundNumber);
}

}

4

1 に答える 1

1

私の推測では、あなたはWebに不慣れであり、おそらくデスクトップユーザー(wpf / winforms)です。この種の質問は、単一層アプリケーションから移行するような人々に共通しています。Webフォームモデルはwinformsのように見えますが、それはそのようなものではないことを覚えておく必要があります。これは、ステートレスな要求/応答クライアント/サーバーモデル(つまりHTTP)に対する薄いベールです。

これが機能しない理由は、非同期カウンタークラスが完了したときに、ページ要求がすでに完了しているためです。すでにブラウザに返送されているため、HTMLを変更する方法はありません。クリックハンドラーが完了すると、ページは「完了」します。asp.netのサーバー側の非同期コードは、基本的に「ヘッドレス」で実行されます。クライアントを必要としない作業を行うのに最適です。

それで、あなたはこれをどのように行いますか?さて、最初は明らかではありませんが、非同期Web作業は通常、サーバーではなくクライアントによって駆動されます。クライアントはブラウザであり、テクノロジーはAJAX-非同期JavaScriptとXMLです。イベントはサーバーで処理され、ページが返され、クライアントのjavascriptは、ページの完全なポストバックを行わずに、サーバーで新しいデータをポーリングします。

以上のことをすべて述べましたが、実際には双方向の非同期性をエミュレートする方法がありますが、基本を理解していないと、難しいと感じるかもしれません。興味がある場合、このテクノロジはSignalR(http://signalr.net/)と呼ばれます。これにより、サーバー(asp.net C#)がクライアント(javascript)のメソッドを呼び出すことができ、その逆も可能です。

したがって、私のアドバイスは、最初にHTTPモデルを基本的なレベルで理解してから、ASP.NETのような抽象化を検討し始めることです。

于 2012-12-04T13:38:55.707 に答える