2012-06-08 2 views
0

Я использую ASP.NETИзменить значение процесса из кода?

Я хочу показать процентное значение для пользователя из кода при работе базы данных.

Я думаю, что проблема здесь, когда я вызываю эту функцию из cs percentege WORKS FINE!

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

Но мой настоящий код подключает базу данных и вставляет 300 - 1000 строк! Когда он работает, значок курсора сервера изменился на значок «Занят», поэтому он заблокирован и я не могу установить процентное значение.

Plz Помощь ...

Я получил WebService:

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; 
       } 
      } 
     }); 

My Cs Action Код защищен недействительным btnAction_Click (объект отправителя, EventArgs е) {

... 
... 
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); 

    ... 
    ... 

}

ответ

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, вы можете получить доступ к данным сеанса и показать ход фонового потока.

+0

thx Я пытаюсь – Mennan

+0

Как я могу назвать еще эту страницуAsyncTask? Его единственный один звонок я не мог понять. Я хочу назвать это каждую секунду, как я могу это сделать? – Mennan

+0

Вы не хотитезывать страницуAsyncTask каждую секунду, только один раз. См. Добавленные примечания в моем ответе. –

Смежные вопросы