updatePanel从ajax调用不同的线程刷新



我有一个可以进行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:CodesRefreshData.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;
}

因此,当过程完成后,我想删除状态文本并启用按钮。但是它仍然存在,并且该按钮仍然被禁用。

如何解决此问题?

您可以使用SignalR将更改推回客户端。它将自动选择最有效的协议(即Websocket,长期填写等)

启动任务时,将条目放在表中,然后将主键返回客户端。客户可以使用计时器继续进行轮询,以查看表格中是否已更改并采取适当的措施。

要检索您可能必须在页面中公开新代码的状态。

最新更新