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中去,即便这样,也至少需要有异常日志记录,你现在谁知道在哪一步有问题呢?
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(); }
(new System.Threading.Tasks.Task(数据库操作的方法)).Start();
{
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 语法则是一种坑人的东西,看似用了顺序的语法,而实际上你这个帖子的问题会层出不穷,因为代码与流程图根本做不到言行一致。
当你出现这种情况时,不管你别的说的多么多,就这个基本的概念上一下在就说明你一定是乱了。