Изменить значение процесса из codebehind?
Я использую ASP.NET
Я хочу, чтобы показать процент для пользователя от codebehind во время работы базы данных.
Я думаю, что проблема здесь, когда я вызываю эту функцию из cs процентных работ работает отлично!
protected void btnUpdate_Click(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(5000);
}
Но мой настоящий код - это подключить базу данных и вставить 300 - 1000 строк!! Когда он работает, значок курсора на сервере меняется на значок "занят", поэтому он замерз, и я не могу установить процентное значение.
Пожалуйста, помогите...
Я получил веб-сервис:
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 по клику:
<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 защищен void btnAction_Click(отправитель объекта, 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);
...
...
}
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, вы можете получить доступ к данным сеанса и показать ход фонового потока.