1

2 つの WCF サービス呼び出しがあります。

[OperationContract]
void ClosePeriod();
[OperationContract]
string GetLogs();

ClosePeriod メソッドは、1 時間かかるストアド プロシージャを実行し、ログ メッセージを生成します。GetLogs メソッドは、ClosePeriod メソッドから生成されたログ メッセージを返します。

ClosePeriod サービス呼び出しを待っている間に、ASP.Net Web ページにログ メッセージを表示しようとしています。

<asp:UpdatePanel ID="UpdatePanelClosing" runat="server">
    <ContentTemplate>
        <asp:Timer ID ="TimerLog" runat ="server" Interval ="3000" OnTick="TimerLog_Tick" Enabled="true"></asp:Timer>
        <table>         
            <tr>
                <td>
                    <div style="margin-top: 10px; margin-bottom: 70px">
                        <asp:Button runat="server" ID="BtnExecuteClosing" Text="Execute" Width="105px" Height="35px"  OnClick="BtnExecuteClosing_Click" />
                    </div>
                </td>
            </tr>
            <tr>
                <td>
                    <p>Process Log:</p>
                </td>
            </tr>
            <tr>
                <td colspan="3">
                    <asp:TextBox ID="TxtProcessLog" runat="server" Width="930px" Height="270" TextMode="MultiLine" Style="resize: none;"
                        ReadOnly="true" Text=""> 
                    </asp:TextBox>
                </td>
            </tr>
        </table>
    </ContentTemplate>
</asp:UpdatePanel>

これまでのところ、非同期で ClosePeriod メソッドを呼び出すことを試み、タイマーを使用して TxtProcessLog テキストボックスを更新しようとしました。

protected async void BtnExecuteClosing_Click(object sender, EventArgs e)        
{
    await webservice.ClosePeriodAsync();
}

protected void TimerLog_Tick(object sender, EventArgs e)
{
    string log = webservice.GetLogs();
    TxtProcessLog.Text = log ; 

}

ただし、TxtProcessLog テキスト ボックスは、ClosePeriod サービス コールが完了した後に更新されます。私は何か間違ったことをしていますか?他のアプローチを提案してください。

4

1 に答える 1

1

ClosePeriod は何をしますか? 多くのログを DB テーブルに書き込みますか? その後、コードは正常に動作するはずです。"webservice.GetLogs()" が string.empty を返す場合、何も表示されません。UpdatePanel からの ClosePeriod 呼び出しは非同期である必要があります。そうしないと、後続のすべての呼び出しがブロックされます。

于 2013-08-08T14:23:27.637 に答える