Windows服务如何运行类库的?

.Net技术 码拜 9年前 (2015-10-23) 1298次浏览
解决方案中有一个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对象里面有一些对数据库的操作。这样行吗?测试了一下,没有运行?

解决方案:10分
你在将实例化类当成方法在用了

你要能运行,需要将数据库操作的过程放在这两个类的构造函数中,如:

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

或者

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

你这连个类建得没啥意义,可以将这部分方法放在你现在这个类里面。

解决方案:10分
兄弟,不能靠别人帮你猜的,何况你现在给的这点代码没曾给出具体过程。

正常的wcf开发应该是先通过自托管方式,通过控制台托管wcf,wcf服务在运行中的各项状态通过控制台可显示出来,这样有助于调试,最终开发完成,再部署到windows services宿主、iis或是was中去,即便这样,也至少需要有异常日志记录,你现在谁知道在哪一步有问题呢?

解决方案:46分
通过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();
}
解决方案:3分
windows会自动调用onstart/stop的。
解决方案:16分
你开始不说清楚,在前面找了半天,你可以在构造函数里尝试通过Task任务执行数据库操作,看看如何。

(new System.Threading.Tasks.Task(数据库操作的方法)).Start();

解决方案:5分
protected override void OnStart(string[] args)

{

Host = new ServiceHost(typeof(MyService));

Host.Open();

new KjUpdate();

new CalculationBalance();

}
如果你的 Host.Open() 是异步执行的,那么你的最后两句就应该在异步执行的代码内部调用(例如回调时调用),而不是顺序地放到 Host.Open() 后边。

解决方案:17分

为什么不能?当然可以在windows service中启动定时器。
但是逻辑上看,此操作只能是 Host.Open() 异步操作成功时才顺序开始的,而不能提前开始。你的代码说明你没有理解什么异步流程。.net 4.5以后的 async/await 语法是一个很扯蛋的语法,且不管其性能低于传统的异步写法的问题,就语法上而言,它貌似让你用顺序操作的语法来写异步操作程序了,但是实际呢?你会调试吗?你会设计吗?
异步操作,那么你的下一步操作,就理应在回调中才执行,而不是在 Host.Open() 下边执行。如果你画一个程序设计时序流程图,你就知道异步跟顺序流程的画法一定是不同的,只有这样才能一目了然。而 async.awai 语法则是一种坑人的东西,看似用了顺序的语法,而实际上你这个帖子的问题会层出不穷,因为代码与流程图根本做不到言行一致。

解决方案:6分
忠告,凡是你看自己的”大白话“的流程描述中有异步(而非同步顺序)的描述的,就要使用回调或者事件来表达,不要一遍说成是异步或者事件驱动的、一边又把代码写成顺序操作的。
当你出现这种情况时,不管你别的说的多么多,就这个基本的概念上一下在就说明你一定是乱了。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Windows服务如何运行类库的?
喜欢 (0)
[1034331897@qq.com]
分享 (0)