我有一个按钮可以进行ajax调用。
<%@ Page Language="C#" MasterPageFile="~/pj.master" AutoEventWireup="true" CodeFile="refreshData.aspx.cs" Inherits="Admin_refreshData" EnableEventValidation="false" %>
<%@ MasterType VirtualPath="~/pj.master" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
<asp:ScriptManager ID="scriptManager1" runat="server"></asp:ScriptManager>
<script type="text/javascript">
function checkSubmit()
{
if (confirm('Are you sure you want to refresh the data?')) {
//Disable our button
$('#<%: butSubmit.ClientID %>').attr("disabled", true);
<%= ClientScript.GetPostBackEventReference(butSubmit, string.Empty) %>;
$.ajax({
error: function (data) {
//The Ajax request was a failure.
alert('Fail to call batch job.');
},
success: function (data) {
$('#<%: lblMsg.ClientID %>').text('Batch job running. Please kindly wait.');
},
complete: function () {
}
});
}
else
return false;
}
</script>
<h1>Refresh Data</h1>
<asp:Panel ID="PnlSearch" runat="server">
<asp:UpdatePanel ID="updtPnlRefresh" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<table border="0" style="width: 100%">
<tr>
<td>
Refresh Data: <asp:Button ID="butSubmit" runat="server" Text="Refresh" OnClientClick="return checkSubmit()" UseSubmitBehavior="false" OnClick ="butSubmit_Click" />
</td>
</tr>
<tr>
<td>
<asp:Label ID="lblMsg" runat="server"></asp:Label>
</td>
</tr>
</table>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Panel>
</asp:Content>
然后在我的后端,单击“提交”按钮时,它将启动另一个耗时的过程。所以我将这个过程分为另一个任务。然后,任务完成后,我想更新结果。但这似乎不起作用。
后面的代码:
protected void Page_Load(object sender, EventArgs e)
{
}
protected void butSubmit_Click(object sender, EventArgs e)
{
new System.Threading.Tasks.Task(RunBatchJob).Start();
lblMsg.Text = "Batch job running. Please kindly wait.";
butSubmit.Enabled = false;
}
private void RunBatchJob()
{
string path = @"D:\Codes\RefreshData.exe";
Master.RemoveErrorMessage();
if (File.Exists(path))
{
Process process = new Process();
process.StartInfo.FileName = path;
process.Start();
process.WaitForExit();
int result = process.ExitCode;
if (result == 0)
Master.AddSuccessMessage("Batch job successfully run.");
else
Master.AddErrorMessage("Batch job failed to run properly.");
}
else
{
Master.AddErrorMessage("Batch job file not found.");
}
lblMsg.Text = "";
butSubmit.Enabled = true;
}
因此,在过程完成后,我想删除状态文本并启用该按钮。但是它仍然存在,并且该按钮仍处于禁用状态。
如何解决这个问题?
答案 0 :(得分:1)
您可以使用SignalR将更改推回客户端。它会自动选择最有效的协议(例如Websockets,LongPolling等)
或者,当您启动任务时,在表中放置一个条目并将主键返回给客户端。客户端可以使用计时器继续轮询,以查看表中的状态是否已更改并采取适当的措施。
要检索状态,您可能必须在页面中公开新代码。