解决方案中有一个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() 后边。
------解决思路----------------------
好牛逼的英文,翻译官在哪里
------解决思路----------------------
为什么不能?当然可以在windows service中启动定时器。
但是逻辑上看,此操作只能是 Host.Open() 异步操作成功时才顺序开始的,而不能提前开始。你的代码说明你没有理解什么异步流程。.net 4.5以后的 async/await 语法是一个很扯蛋的语法,且不管其性能低于传统的异步写法的问题,就语法上而言,它貌似让你用顺序操作的语法来写异步操作程序了,但是实际呢?你会调试吗?你会设计吗?
异步操作,那么你的下一步操作,就理应在回调中才执行,而不是在 Host.Open() 下边执行。如果你画一个程序设计时序流程图,你就知道异步跟顺序流程的画法一定是不同的,只有这样才能一目了然。而 async.awai 语法则是一种坑人的东西,看似用了顺序的语法,而实际上你这个帖子的问题会层出不穷,因为代码与流程图根本做不到言行一致。
------解决思路----------------------
我忠告你一下,凡是你看自己的”大白话“的流程描述中有异步(而非同步顺序)的描述的,就要使用回调或者事件来表达,不要一遍说成是异步或者事件驱动的、一边又把代码写成顺序操作的。
当你出现这种情况时,不管你别的说的多么多,就这个基本的概念上一下在就说明你一定是乱了。