当前位置: 代码迷 >> C# >> Windows服务如何运行类库的
  详细解决方案

Windows服务如何运行类库的

热度:93   发布时间:2016-05-05 02:36:11.0
Windows服务怎么运行类库的?
解决方案中有一个Windows服务,承载WCF服务,同时在解决方案中还有一些类库,如下面这样:

public partial class CalculatorHost : ServiceBase
{
    public CalculatorHost()
    {
        InitializeComponent();
    }
    private ServiceHost _host;
    public ServiceHost Host
    {
        get { return _host; }
        set { _host = value; }
    }
    protected override void OnStart(string[] args)
    {
        Host = new ServiceHost(typeof(MyService));
        Host.Open();
        new KjUpdate();
        new CalculationBalance();
    }
    protected override void OnStop()
    {
        if (Host != null)
        {
            Host.Close();
            Host = null;
        }
    }
}

在OnStart方法中new对象运行,KjUpdate与CalculationBalance对象里面有一些对数据库的操作。这样行吗?我测试了一下,没有运行呢,这个是怎么弄的呢?
------解决思路----------------------
你在将实例化类当成方法在用了
你要能运行,需要将数据库操作的过程放在这两个类的构造函数中,如:

class KjUpdate
{
public KjUpdate()
{
//数据库操作
}
}

或者

class KjUpdate
{
public void 数据库操作()
{
//数据库操作
}
}
//然后你在代码中这样写:
(new KjUpdate()).数据库操作();

你这连个类建得没啥意义,可以将这部分方法放在你现在这个类里面。
------解决思路----------------------
兄弟,不能靠别人帮你猜的,何况你现在给的这点代码没曾给出具体过程。
正常的wcf开发应该是先通过自托管方式,通过控制台托管wcf,wcf服务在运行中的各项状态通过控制台可显示出来,这样有助于调试,最终开发完成,再部署到windows services宿主、iis或是was中去,即便这样,也至少需要有异常日志记录,你现在谁知道在哪一步有问题呢?
------解决思路----------------------
通过ServiceHost转为打开状态时事件进行操作,试一下。

static void Main(string[] args)
{
Uri baseAddress = new Uri("http://localhost:8000/MyService");
ServiceHost selfHost = new ServiceHost(typeof(MyService), baseAddress);
selfHost.Opened += dbSave_Opened;
try
{
//......
selfHost.Open();
//......
}
catch (CommunicationException ce)
{
//......
}
}

private static void dbSave_Opened(object obj,EventArgs e)
{
new KjUpdate();
}

------解决思路----------------------
你试过自己的服务吗?能访问吗?
------解决思路----------------------
Windows服务还没有搞过呢,高大上呢
------解决思路----------------------
windows会自动调用onstart/stop的。
------解决思路----------------------
我就说嘛,你开始不说清楚,在前面找了半天,你可以在构造函数里尝试通过Task任务执行数据库操作,看看如何。
(new System.Threading.Tasks.Task(数据库操作的方法)).Start();
------解决思路----------------------
    protected override void OnStart(string[] args)
    {
        Host = new ServiceHost(typeof(MyService));
        Host.Open();
        new KjUpdate();
        new CalculationBalance();
    }

如果你的 Host.Open() 是异步执行的,那么你的最后两句就应该在异步执行的代码内部调用(例如回调时调用),而不是顺序地放到 Host.Open() 后边。
------解决思路----------------------
好牛逼的英文,翻译官在哪里
------解决思路----------------------
引用:
在KjUpdate中,定时器是定时执行数据库操作,是不会停止的。它原本就是一个应用程序,会定时从网络上获取更新数据到数据库,这种不会停止的任务能不能放到OnStart里面去执行呢? 


为什么不能?当然可以在windows service中启动定时器。

但是逻辑上看,此操作只能是 Host.Open() 异步操作成功时才顺序开始的,而不能提前开始。你的代码说明你没有理解什么异步流程。.net 4.5以后的 async/await 语法是一个很扯蛋的语法,且不管其性能低于传统的异步写法的问题,就语法上而言,它貌似让你用顺序操作的语法来写异步操作程序了,但是实际呢?你会调试吗?你会设计吗?

异步操作,那么你的下一步操作,就理应在回调中才执行,而不是在 Host.Open() 下边执行。如果你画一个程序设计时序流程图,你就知道异步跟顺序流程的画法一定是不同的,只有这样才能一目了然。而 async.awai 语法则是一种坑人的东西,看似用了顺序的语法,而实际上你这个帖子的问题会层出不穷,因为代码与流程图根本做不到言行一致。
------解决思路----------------------
我忠告你一下,凡是你看自己的”大白话“的流程描述中有异步(而非同步顺序)的描述的,就要使用回调或者事件来表达,不要一遍说成是异步或者事件驱动的、一边又把代码写成顺序操作的。

当你出现这种情况时,不管你别的说的多么多,就这个基本的概念上一下在就说明你一定是乱了。
  相关解决方案