0

ASP.NETを使用しています

データベースが機能している間、コードビハインドからユーザーにパーセンテージを表示したい。

この関数をcspercentegeWORKSFINEから呼び出すと、問題が発生すると思います。

  protected void btnUpdate_Click(object sender, EventArgs e)
  {
        System.Threading.Thread.Sleep(5000);
  }

しかし、私の実際のコードは、データベースに接続して300〜1000行を挿入することです。動作するとサーバーカーソルアイコンがビジーアイコンに変わったため、フリーズし、パーセンテージ値を設定できません。

Plzヘルプ...

私はウェブサービスを手に入れました:

    public double CommittedCount = 0;

    [WebMethod]
    public string ShowPercentage()
    {
        return ((CommittedCount / FinishCount) * 100 ).ToString();
    }

    [WebMethod]
    public void SetCommittedCount(double committedCount)
    {
        CommittedCount = committedCount;
    }


    public double FinishCount
    {
        get
        {
                if(Glob.ExcelDataSet.Tables[0].Rows.Count > 0)
                    return Glob.ExcelDataSet.Tables[0].Rows.Count;
                return 1;

        }
    }

私はajaxcall関数を手に入れました:

function updateProgress() {
        $.ajax({
            type: "POST",
            url: '<%=ResolveUrl("~/processCalculator.asmx/ShowPercentage") %>',
            data: "{}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            async: true,
            success: function (msg) {
                // TODO: revert the line below in your actual code
                //$("#progressbar").progressbar("option", "value", msg.d);
                $(".percentage").text(msg.d);
                if (msg.d < 100) {
                    setTimeout(updateProgress, 100);
                }
            }
        });

    }

私はupdateProgressボタンをonclickと呼びました:

<asp:Button Text="Sorgula" ID="btnAction" class="button_action" OnClick="Action_Click" Width="80px" runat="server" />

        $(".button_action").click(function () {
            var action_ = $(this).attr("value");
            var ExcelRowCount = $('#<%=ExcelActionsIsAvaibleRowCount.ClientID %>').val();
            if (ExcelRowCount != "") {
                if (confirm(ExcelRowCount + " kayıt için [" + action_ + "] aksiyonu gerçekleştirilecek?")) {
                    setTimeout(updateProgress, 100);
                    return true;
                }
                else 
                {
                    return false;
                }
            }
        });

私のCsアクションコードはvoidbtnAction_Click(object sender、EventArgs e){

...
...
for (int rowIndex = 1; rowIndex < Glob.ExcelDataSet.Tables[0].Rows.Count; rowIndex++)
{
   ...     
   ...                

   aksiyon_sonucu_ = action.InsertRow(
   Glob.ExcelDataSet.Tables[0].Rows[rowIndex], DegistirilebilirKolonlar, true);

  // my persentage
  processCalculater pCal = new processCalculater();
  pCal.SetCommittedCount(rowIndex);

  ...
  ...

}

4

1 に答える 1

1

PageAsyncTask(または他のマルチスレッド)を使用する必要があります。

こちらがMSDNの使用法に関する記事で、進行状況インジケーターを示す例もあります。

http://msdn.microsoft.com/en-us/library/system.web.ui.pageasynctask.aspx

マルチスレッドのその他のオプションは次のとおりです。

ThreadPool.QueueUserWorkItem(s => System.Threading.Thread.Sleep(5000))

new Thread(() => System.Threading.Thread.Sleep(5000)){ IsBackground = true }.Start() 

アイデアは、(上記の手法のいずれかを使用して)長時間実行するタスクをバックグラウンドスレッドに配置することです。進行状況を保存するには、コンテキスト(セッション)を渡します。次に、AJAXとWebMethodを使用して、セッションデータにアクセスし、バックグラウンドスレッドの進行状況を表示できます。

于 2012-06-08T10:55:50.903 に答える