从问题说开来……
2014-02-21 09:58 hailants 阅读(742) 评论(1) 编辑 收藏 举报在博问上回答了一些问题,偶发一些感想……
问题1:
如何用windows的命令行来控制一个服务程序,比如输入一个自定义的命令,某个windows服务就可以进行相应的操作。我的意思是我开发了一个windows服务,这个服务里面有一个下载图片的功能,我希望在命令行里输入download:http://www.XXXX.com就可以把里面的图片下载下来(这是一个例子为阐明问题,不是实际需求)
答:曲线救国:
1.写一个服务,
2.写一个控制台程序,
3.问题转化为服务与控制台程序之间的交互,即进程间交互。
想法:
这个问题直接搜索答案的话可能真的不太好找,但是要学会将未知解的问题转变为已知解的问题,即使经过这样的转化后可能会将解决方案变得很复杂。
我们的目的是什么?是解决问题,花费10个小时去搜寻一个直接方案并花1个小时完成和花1个小时构建一个复杂方案并2个小时完成来相比,显然后者更优(PS:如果你的目的是简化代码或者是优化速度等这种问题的话,可能前者更优)。毕竟老板才不管你使用的方案如何,他关心的是你同样的工作时间完成了多少工作,解决了几个问题。而对用户,你只需要证明你的方案可以实现用户的需求,并且好用、稳定就行。
说回到上面的问题,目的是什么?是通过命令行与服务进行交互。命令行能做什么?调用应用程序执行,并可以传递参数。服务是什么?是在后台允许的应用程序。那应用程序之间能不能交互?这个问题大家应该都碰到过,各有各的解决方案,即使没实际解决过,很多教材中也有现成的例子,没看过教材的去网上搜一搜也是大把的资料。那命令行程序怎么写?好吧,进程间交互还算是个中级问题,这个只能算基础了。
问题的延伸:
问:那这控制台又如何与该windows服务交互呢?
问://若干代码
然后再命令行输入***.exe 3232323结果程序没有执行,请问大侠如何给控制台传参啊?
想法:虽然大侠可能不厌其烦的回答,但是提问者是不是同样要思考下:这不是老师与学生的面对面辅导,在网络这个环境中首先要学会的应该是尝试自己解决问题。
碰到性格好一点的大侠,可能会耐心的回答这些问题,碰到性格一般的估计就不再会理你,再碰到性格爆点的,估计就@#¥%……君不见各种论坛上的骂战么?
问题2:
//若干代码
this.BeginInvoke(new Action(() =>
{
loginImgFrm.ShowDialog();
}));
主窗体要等待 验证码窗体传回验证码后,再继续操作,请问这个要怎么写。
答:
if(loginImgFrm.ShowDialog()==DialogResult.OK)
......
在验证码窗口中关闭前设置DialogResult字段值即可
想法:1.这个问题看上去很基础,其实稍微研究一下ShowDialog()的返回值或者是form的字段就能找到DialogResult的用法了,我想仔细了解你使用的每个类的资料应该是基本过程,或者,想实现某功能的时候,临时翻一下类的字段、方法列表也行。
2.还是问题1的那个曲线救国:目的是啥?是验证码窗体要传回验证码,验证码窗体是个对象吧?对象可以有字段吧?传回的验证码验证结果可以设为字段吧?ShowDialog()是阻塞的吧?验证码窗体关闭后就会执行ShowDialog()后面的代码吧?这里去获取窗体的一个字段没问题吧?需要异步的话,验证码窗体关闭事件响应一下没问题吧?OK,问题解决了,其实就是个对象的一个属性字段传值的事。
问题的延伸:
既然主窗体要等待验证码窗体传回验证码后,再继续操作,为什么提问者的代码中用了Invoke?这个又表示提问者不想验证码窗体干扰主窗体的操作,这本身与问题就冲突的。
然而再深究一下BeginInvoke的执行机制,其实质是当主窗体线程有空闲时,在主窗体线程执行Invoke中的代码,即ShowDialog(),但是ShowDialog()又是个阻塞方法,其最终结果将导致阻塞主窗体线程,表象就是show出来的窗体不关闭,主窗体就啥都不能干。
结果就是上面的代码和不使用BeginInvoke完全是一个效果。
所以,仔细了解你使用的每个方法的资料应该是基本过程。虽然深究BeginInvoke的执行机制已经算是有些深度,但是至少,Invoke和BeginInvoke是在什么情况下需要使用的,使用后会产生什么效果,这些是必须要知道的,当实际效果与理论效果不一致的时候,你就需要做深入的研究了,问题到底出在哪里。另,其实Invoke的执行机制基本上每个讲invoke的教材上基本都会说。
问题3:
C# 窗体 Close() 和 OnClosing() 的区别是什么
发现重写OnClosing方法可以屏蔽窗体关闭事件,
protected override void OnClosing(CancelEventArgs e)
{
e.Cancel = true;
}
就是说这个方法和窗体关闭是挂钩的,但我直接调用这个方法却关不了窗体
this.OnClosing(new CancelEventArgs(false));
答案:这个其实是很简单的问题,建议提问者好好学习下基础知识。
问题的延伸:
问:如果你有这方面(基础知识)的书籍或帖子的话,请推荐下.我是半路出生的,没系统的学过,所以很多你们看来是简单的问题,在我看来搞不明白的还是搞不明白,谢谢。
答:去各大文库搜索一下.net开发基础之类的文章看一下。
学习与半路没什么关系,我也是半路,也没有经过系统学习,但是要记得,当遇到一个问题时,不光要知道怎么解,而且要学着知道为什么这么解,以上面的问题为例:你就需要尝试去了解:close和onclosing还有closing事件三个之间是什么关系。进而去深入了解什么是重载、什么是事件,为什么close要通过onclosing方法触发closing事件,这样的设计有什么样的好处……久而久之你的知识就会慢慢延伸组织成一个系统。
当然,如果你想要在这条路上一直走下去,那还是需要系统学习的,但是到那个时候,你系统学习的过程就是将你的知识网进行重组织,补齐其中缺失的地方。
先用后学,用以致学,学以致用……
其实说白了,这样的问题如果真的有心的话,很多资料中都能够找到答案,而且这属于面向对象编程中需要了解的基础知识。一个人做一样工作,不管如何,了解你工作的基本知识是必需的,而且这应该是一个自发的过程,不能以各种理由来搪塞,否则你是做不好这份工作的。
PS:最后一个想法,感觉博问中不少问题的答案似乎与问题驴唇不对马嘴,也许有的是提问者描述的不清楚,但是我想本着严谨的态度,既然是作为老师这个角色来回答问题,就不应该有想当然的成分在。