3

私の目標:

  1. ユーザーがボタンをクリック
  2. ボタンは myTimeConsumingProcess() を開始します
  3. 同じページの TextBox は 1 秒に 1 回更新され、プロセスが完了するまで "." が追加されます。

私が持っているもの(これは機能しますが、私が望むものではありません):

  1. ユーザーがボタンをクリックします myTimeConsumingProcess() を開始するボタン
  2. 新しいスレッドが myTimeConsumingProcess() を実行します
  3. ユーザーは「処理中」ページにリダイレクトされます
  4. ブール値のセッション変数を使用すると、前のページに残されたスレッドがセッション変数を false に切り替えるまで、このページは際限なく更新されます。

これまでのコード:

DatabaseChecker.aspx.cs

protected void btnStartProcess_Click(object sender, EventArgs e)
{
    Session["Running"] = true;
    Session["TextBoxContent"] = "Beginning myTimeConsumingProcess()...";
    Thread thread = new Thread(new ThreadStart(MyTimeConsumingProcess));
    thread.Start();
    Response.Redirect("Processing.aspx");
}

private void myTimeConsumingProcess()
{
    //do stuff!
    Session["TextBoxContent"] += "SUCCESS!"
    Session["Running"] = false;
}

処理.aspx

毎秒ページを更新します。

<meta http-equiv="refresh" content="1" /> 

Processing.aspx.cs

スレッド (DatabaseChecker.aspx.cs に残っている) がセッション変数 "Running" を false に変えるまで、このページにとどまり、1 秒ごとに更新します。

protected void Page_Load(object sender, EventArgs e)
{
    TextBox1.Text = Session["TextBoxContent"].ToString();
    Session["TextBoxContent"] += ".";

    if ((bool)Session["Running"] == false)
    {
        Response.Redirect("DatabaseChecker.aspx");
    }
}

私が理解できないことが欲しい:

可能であれば、別のページへのリダイレクトを避け、代わりにボタンがクリックされたページの TextBox を更新したいと思います。プロセスのどこにいるかを示すために、QueryString を使用して同じページにリダイレクトしようとしました。ただし、これは機能しません --- 同じページにリダイレクトするコードに到達し、テキストが更新されますが、プロセスが完了するまで何も起こらないように見えます (スレッドの目的が無効になります)。

、コントロール、およびそれらのコントロールを Threads と組み合わせて使用​​し、.aspx ページの Async プロパティを true に設定して、考えられる事実上すべての組み合わせを含むUpdatePanel、考えられるすべての代替手段を試しました。Timer PageAsyncTask

4

2 に答える 2

1

AJAX を使用してみましたか。

ボタンをクリックすると、時間のかかるプロセスを開始する AJAX 関数がトリガーされます。

次に、AJAX を使用してページの進行状況をポーリングします。


過去にこれを行った方法を説明するコードを追加しました。

これに更新パネルが必要かどうかは実際にはわかりませんが、私は持っています。

これは、私が持っているコードの一部を切り取ったもので、あなたが望むと私が信じていることを実行します。元のコードは画像を処理し、進行状況バーをユーザーに表示しました。

プロジェクトの参照として AjaxControlToolkit と Ajax があります。

http://ajaxcontroltoolkit.codeplex.com/

これにより、スクリプトマネージャーがページに追加されます

<ajaxToolkit:ToolkitScriptManager runat="server" ID="scriptManageer" EnablePartialRendering="true" AsyncPostBackTimeout="900" />

これはページの「重要」部分です。

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <div id="message">&nbsp;</div>

        <button id="btnSave" class="saveButton" onclick="doSomething();return false;">Save</button>
    </ContentTemplate>
</asp:UpdatePanel>`

この JavaScript により、ポーリングが機能します。

<script type="text/javascript">
    function startPoll()
    {
        Default.DoThing();
        myInterval = setInterval("poll()", 1000); //If you really want to poll that often
    }

    function poll()
    {
        progress = Default.ThingProcess();
        if (progress == "100%")
        {
            clearInterval(myInterval);
        }
        document.getElemenyById("message").innerHTML = progress;
    }
</script>

そして、これは私のコードビハインドです。

public partial class Default : System.Web.UI.Page
{
    protected void Page_load(object sender, EventArgs e)
    {
        Ajax.Utility.RegisterTypeForAjax(typeof(Default));
    }

    [Ajax.AjaxMethod]
    public void DoThing()
    {
        Thread thread = new Thread(new ThreadStart(MyTimeConsumingProcess));
        thread.Start();
        //The MyTimeConsumingProcess updates a var for thing progess
    }

    [Ajax.AjaxMethod]
    private String ThingProgress()
    {
        //Reads some var
        return progressNumber + "%"
    }
}

切り取りと貼り付けのために、必要のないものが含まれている可能性がありますが、動作を停止するべきではありません。

于 2012-08-09T02:12:13.053 に答える
0

の 2 番目のパラメータをResponse.Redirecttotrueに設定すると、ページ処理を待機しない可能性があります。

public void Redirect(string url, bool endResponse);
于 2012-08-09T02:13:44.877 に答える