加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

退出后C#控制台应用程序仍在内存中 – 异步Web服务

发布时间:2020-12-15 17:24:27 所属栏目:百科 来源:网络整理
导读:我是C#和.Net的新手.我的老板让我使用Web服务使用异步回调创建一个计时器.我实际上创建了它,并让它工作,但每当我关闭控制台应用程序窗口时,Web服务仍在运行.当我重新运行应用程序时,它从0开始计数器,但是来回跳转到前一次运行的数字(仍然在记忆中). mainMeth
我是C#和.Net的新手.我的老板让我使用Web服务使用异步回调创建一个计时器.我实际上创建了它,并让它工作,但每当我关闭控制台应用程序窗口时,Web服务仍在运行.当我重新运行应用程序时,它从0开始计数器,但是来回跳转到前一次运行的数字(仍然在记忆中).

mainMethod()每10秒将数字增加1,monitorMethod()读取该数字,并返回一个字符串.

如何停止Web服务,并在每次关闭控制台窗口时将计数器重置为0?

我希望这是有道理的!提前致谢!

这是我的代码.

网络服务:

public class Service1 : System.Web.Services.WebService
 {
    private int iTotal;
    private int iCurrent;

    [WebMethod]
    public void mainMethod()
    {
        iTotal = 42;
        iCurrent = 1;
        Application["iTotal"] = iTotal;
        Application["iCurrent"] = iCurrent;
        // sleep 10 seconds
        while (iCurrent <= iTotal)
        {
            Application["iCurrent"] = iCurrent;
            iCurrent++;
            System.Threading.Thread.Sleep(10000);                
        }
    }

    [WebMethod]
    public string monitorMethod()
    {
        iCurrent = int.Parse(Application["iCurrent"].ToString());
        iTotal = int.Parse(Application["iTotal"].ToString());
        if (iCurrent <= iTotal)
        {
            return iCurrent + " of " + iTotal;
        }
        else
            return "DONE";
    }
  }
}

客户端

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender,EventArgs e)
    {
        Service1 client = new Service1(); //web service proxy
        client.mainMethodCompleted += new mainMethodCompletedEventHandler(client_mainMethodCompleted);

        if (Session["value"] == null)
        {
            Session["value"] = true;
        }

        if (!IsPostBack)
        {
            client.BeginmainMethod(AsyncCallback,null);
            string scriptFunction = "<script type="text/javascript">function reSubmit(){ document.getElementById("" + btnProcessNext.ClientID + "").click(); }</script>";
            this.RegisterClientScriptBlock("s1",scriptFunction);
            string script = "<script type="text/javascript">setTimeout("reSubmit()",500);</script>";
            this.RegisterStartupScript("submit",script);
        }
        else
        {
            if (StringParseByMe(lblStatus.Text))
            {
                string scriptFunction = "<script type="text/javascript">function reSubmit(){ document.getElementById("" + btnProcessNext.ClientID + "").click(); }</script>";
                this.RegisterClientScriptBlock("s1",scriptFunction);
                string script = "<script type="text/javascript">setTimeout("reSubmit()",500);</script>";
                this.RegisterStartupScript("submit",script);
            }
            else
                return;
        }
    }

    protected void btnProcessNext_Click(object sender,EventArgs e)
    {
        Service1 client = new Service1();
        string label = client.monitorMethod();
        Session["value"] = StringParseByMe(label);
        lblStatus.Text = label;
    }

    private bool StringParseByMe(string sparse)
    {
        if (sparse == "DONE")
            return false;

        string[] sparseArray = sparse.Split(' ');
        if (int.Parse(sparseArray[0]) == int.Parse(sparseArray[2]))
        {
            return false;
        }
        else
            return true;
    }

    void client_mainMethodCompleted(object sender,System.ComponentModel.AsyncCompletedEventArgs e)
    {
        Service1 client = new Service1();
        client.EndmainMethod(ar);
    }

    public void AsyncCallback(IAsyncResult ar)
    {
    }
  }
}

网页

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>
    Counter</h2>
    <br /><br /><br /><br /><br /><br />
<asp:Label ID="lblStatus" runat="server" Text="0 of -1" Font-Bold="True" 
    Font-Size="XX-Large" ForeColor="#CC0000"></asp:Label>
    <br /><br /><br /><br />
<asp:Button ID="btnProcessNext" runat="server" Text="Refresh" 
    onclick="btnProcessNext_Click" />
</asp:Content>

解决方法

您可以在页面上放置一个按钮,并在按钮的单击事件中编写停止计时器的逻辑.之后,生成一个脚本来关闭窗口.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读