一切福田,不離方寸,從心而覓,感無不通。

Category Archives: Programming Language

c#中跨线程调用windows窗体控件

我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。 首先来看传统方法:

运行这段代码,我们会看到系统抛出一个异常:

这是因为.net 2.0以后加强了安全机制,不允许在winform中直接跨线程访问控件的属性。那么怎么解决这个问题呢,下面提供几种方案。 第一种方案,我们在Form1_Load()方法中加一句代码:

加入这句代码以后发现程序可以正常运行了。这句代码就是说在这个类中我们不检查跨线程的调用是否合法(如果没有加这句话运行也没有异常,那么说明系统以及默认的采用了不检查的方式)。然而,这种方法不可取。我们查看CheckForIllegalCrossThreadCalls 这个属性的定义,就会发现它是一个static的,也就是说无论我们在项目的什么地方修改了这个值,他就会在全局起作用。而且像这种跨线程访问是否存在异常,我们通常都会去检查。如果项目中其他人修改了这个属性,那么我们的方案就失败了,我们要采取另外的方案。 下面来看第二种方案,就是使用delegate和invoke来从其他线程中控制控件信息。网上有很多人写了这种控制方式,然而我看了很多这种帖子,表明上看来是没有什么问题的,但是实际上并没有解决这个问题,首先来看网络上的那种不完善的方式:

使用这种方式我们可以看到跨线程访问的异常没有了。但是新问题出现了,界面没有响应了。为什么会出现这个问题,我们只是让新开的线程无限循环刷新,理论上应该不会对主线程产生影响的。其实不然,这种方式其实相当于把这个新开的线程“注入”到了主控制线程中,它取得了主线程的控制。只要这个线程不返回,那么主线程将永远都无法响应。就算新开的线程中不使用无限循环,使可以返回了。这种方式的使用多线程也失去了它本来的意义。 现在来让我们看看推荐的解决方案:

运行上述代码,我们可以看到问题已经被解决了,通过等待异步,我们就不会总是持有主线程的控制,这样就可以在不发生跨线程调用异常的情况下完成多线程对winform多线程控件的控制了。   原文:http://www.cnblogs.com/zhaotiantang/archive/2009/03/17/1414135.html from:http://www.cnblogs.com/txw1958/archive/2012/08/21/csharp-crossthread-widget.html

龙生   04 Jun 2015
View Details

WebAPI用法

昨天看了两篇文章: ASP.NET Web API(一):使用初探,GET和POST数据【Parry】 HttpClient + ASP.NET Web API, WCF之外的另一个选择【dudu】 通过这两篇文章让我了解了WEB API的简单用法。 Parry是在MVC中使用WebAPI:在Visual Studio 2012中新建MVC4项目,在App_Start目录下有一个WebApiConfig.cs文件,这个文件中就是相应的Web API的路由配置了。 我也根据这两篇文章写了一个简单的测试程序。 先创建了一个UserModel

然后添加Web API Controller

注册路由

在Global中注册

这个时候用地址栏访问地址:api/user/getadmin 这个时侯默认返回的是XML数据模型。 使用AJAX请求这个api,指定数据格式为json

alert出来的结果是: 这样看来,真的是dudu所说的,可以根据请求的数据类型返回指定的数据格式。   POST数据 修改一下controller,添加一个add方法

只为了测试,所以这里只判断一下传入的实体是否为空,如果不为空则返回true 我在页面上添加了一个button,代码如下:

添加JS代码

再次运行页面 我们附加进程进行调试,在发送ajax请求的时候,服务器段接收到的数据如图: from:http://www.cnblogs.com/youring2/archive/2013/03/08/2949455.html

龙生   25 May 2015
View Details

[转]Entity FrameWork初始化数据库的四种策略

程序猿就是苦逼,每天还得分出一些时间去写博文。天真的很热,今天就随便写一点啦! 1、EF初始化数据库的四中策略 EF可以根据项目中的模型自动创建数据库。下面我们就分类看看Entity Framework数据库初始化四种策略 一、 //每次运行都会创建新的数据库 Database.SetInitializer(new DropCreateDatabaseAlways()); 二、//只有第一次运行~才会创建新的数据库~默认的方式 Database.SetInitializer(new CreateDatabaseIfNotExists()); 三、 //修改模型后~运行~会创建新的数据库 Database.SetInitializer(new DropCreateDatabaseIfModelChanges()); 四、//使用自己配置的数据库,请到:web.config中配置自己的连接字符串,注意连接字符串的名称应与上下文:XXXXContext的名字一致。 Database.SetInitializer(null); 注:以上代码请到Global.asax中加上,加上之后会有破浪线,请添加EF的命名空间:using System.Data.Entity; 实例代码如下: protected void Application_Start() { //Entity Framework数据库初始化四种策略 //自己去配置连接字符串 Database.SetInitializer(null); //默认方式 第一次创建 Database.SetInitializer(new CreateDatabaseIfNotExists()); //每一次都会删除旧数据库然后创建新的数据库 Database.SetInitializer(new DropCreateDatabaseAlways()); //模型关系改变时创建新数据库 Database.SetInitializer(new DropCreateDatabaseIfModelChanges()); AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); AuthConfig.RegisterAuth(); } 2、讲完了上述四中策略,下面就讲解一下EF的约定优先原则: EF会尽可能的使用约定而非配置,如果在程序运行时,不按照上述四方法配置具体的数据库连接方式,EF将按照约定创建一个连接,也就是根据模型关系创建一个数据库。EF 创建新数据库的过程如下: 首先EF将尝试连接SQLserverExpress的本地实例,并且查找与上下文:XXXXContext名字相同的数据库,如果EF找不到这个数据库,EF则会根据约定创建一个数据库。 from:http://m.blog.csdn.net/blog/jiangfei009003/38691327

龙生   24 May 2015
View Details

使用System.Timers.Timer类实现程序定时执行

在C#里关于定时器类有3个:System.Windows.Forms.Timer类、System.Threading.Timer类和System.Timers.Timer类。 System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API  SetTimer实现的。它的主要缺点是计时不精确,而且必须有消息循环,Console  Application(控制台应用程序)无法使用。 System.Timers.Timer和System.Threading.Timer非常类似,它们是通过.NET Thread Pool实现轻量、精确的计时,对应用程序、消息没有特别的要求。System.Timers.Timer还可以应用于WinForm,完全取代上面的Timer控件。它们的缺点是不支持直接的拖放,需要手工编码。 public int wrong = 0; System.Timers.Timer time = new System.Timers.Timer(); private void begin_Click(object sender, EventArgs e) { if (action.Text == "启动监测") { action.Text = "停止监测"; label2.Text = "已启动"; if (time.Interval.ToString() == "100") // The default value of interval is 100s. { time.Elapsed += new ElapsedEventHandler(TimeEvent); time.Interval = 1000; } time.Enabled = true; } else { action.Text = "启动监测"; label2.Text = "已停止"; time.Enabled = false; } } private static void TimeEvent(object source, ElapsedEventArgs e) { int tsec = e.SignalTime.Second; int isec = 10; if (tsec == isec) //it will be activated at 10s of every minutes. { if (!Check("http://www.test.com")) { string smtp_server="192.168.8.1"; int port = 25; string mail_from = "test_from@163.com"; string sender="test"; string mail_to = "test_to@163.com"; string receiver="adminer"; string subject = "The site is run out exception on " + DateTime.Now.ToString("yyyyMMddhhmmss"); string body = "The site can not open on " + DateTime.Now.ToString() + ",please check it !"; try { SendEmail(smtp_server, port, mail_from, sender, mail_to, receiver, subject, body); } catch(Exception ex) { MessageBox.Show(ex.Message); } } } } private static bool Check(string urlStr) { HttpWebRequest myWebRequest = null; try { myWebRequest = (HttpWebRequest)WebRequest.Create(urlStr); HttpWebResponse res = (HttpWebResponse)myWebRequest.GetResponse(); if (res.StatusCode == HttpStatusCode.OK) { res.Close(); return true; } else { res.Close(); return false; } } catch (Exception) { return false; } } public static void SendEmail(string smtp_server, int port, string mail_from, string sender, string mail_to, string receiver, string subject, string body) { MailAddress from = new MailAddress(mail_from, sender); MailAddress to = new MailAddress(mail_to, receiver); MailMessage message = new MailMessage(from, to); message.BodyEncoding = Encoding.UTF8; message.IsBodyHtml = true; message.Subject = subject; message.Body = body; SmtpClient client = new SmtpClient(smtp_server, port); //SmtpClient client = new SmtpClient(smtp_server); […]

龙生   18 May 2015
View Details

Lucene.Net

阅读目录 开始 Lucene简介 效果图 Demo文件说明 简单使用 重点类的说明 存在问题 调整后 Lucene.Net博文与资源下载 做过站内搜索的朋友应该对Lucene.Net不陌生,没做过的也许会问:就不是个查询嘛!为什么不能使用Like模糊查找呢? 原因很简单--模糊查询的契合度太低,匹配关键字之间不能含有其他内容。最重要的是它会造成数据库全表扫描,效率底下,即使使用视图,也会造成数据库服务器"亚历山大",那LuceneNet又是一个神马东西?如何使用?以下给出详细的介绍包括Demo 回到顶部 Lucene简介 首先说明的是--Lucene.Net只是一个全文检索开发包,不是一个成型的搜索引擎, 它的功能就是负责将文本数据按照某种分词算法进行切词,分词后的结果存储在索引库中,从索引库检索数据的速度灰常快. 对以上加粗的词汇稍作下阐述: 文本数据:Lucene.Net只能对文本信息进行检索,所以非文本信息要么转换成为文本信息,要么你就死了这条心吧! 分词算法:将一句完整的话分解成若干词汇的算法  常见的一元分词(Lucene.Net内置就是一元分词,效率高,契合度低),二元分词,基于词库的分词算法(契合度高,效率低)… 切词:将一句完整的话,按分词算法切成若干词语 比如:"不是所有痞子都叫一毛" 这句话,如果根据一元分词算法则被切成: 不 是 所 有 痞 子 都 叫 一 毛 如果二元分词算法则切成: 不是 是所 所有 有痞 痞子 子都 都叫 叫一  一毛 如果基于词库的算法有可能:不是 所有 痞子 都叫 一毛 具体看词库 索引库:简单的理解成一个提供了全文检索功能的数据库 如果文字难以理解 见Demo文件说明中的右侧图吧 回到顶部 效果图 首先展示效果图,避免各位观众不知偶所云. 这里有三张图: 图1 简单使用页面效果图 图2 对数据库新增数据后 索引库更新效果图 图3 将图2中的新增数据修改后 索引库更新效果图 回到顶部 Demo文件说明 回到顶部 简单使用 图1中的BookList.aspx 页面

BookList.aspx.cs 后台的处理操作

使用的分词方法与关键字变红 SplitContent.cs

回到顶部 重点类的说明 Analyzer类:LuceneNet中分词算法的基类 任何自定义算法都需继承它 FSDirectory类: 指定索引库文件存放文件位置  是Directory的子类(它有两个子类 还有一个RAMDirecory,它用来指定将索引库文件存放在内存中) IndexReader:对索引进行读取的类 静态方法bool  IndexExists(Directory […]

龙生   18 May 2015
View Details

VS2010 优化运行速度

刚安装完VS2010,不仅启动速度慢,编写代码什么的都慢,卡死!!! 1.禁止VS2010显示启动动画 右键VS2010快捷方式,选择【属性】,在【目标】的后面加上:/nosplash(在exe后面加一个空格再写/nosplash),截图如下: 2.让VS2010启动后,显示空环境。 在VS2010中,打开【工具】—-〉〉〉【选项】—-〉〉〉【环境】—-〉〉〉【启动】,在【启动时】选择【显示空环境】,截图如下: 3.禁止VS2010在启动时,启动外部程序。 在VS2010中,选择【工具】—-〉〉〉【外接程序管理器】,截图如下: 在外接程序管理器中,去掉所有外接程序前面的钩,然后确定即可。截图如下: 4、去掉VS2010视觉体验 老样子,在VS2010中,选择【工具】—-〉〉〉【选项】—-〉〉〉【环境】—-〉〉〉【常规】,在右边找到【视觉体验】, 把视觉体验下面所有的钩给去掉即可。截图如下: 5.禁用【IntelliTrace】 在VS2010中,选择【工具】—-〉〉〉【选项】—-〉〉〉【IntelliTrace】,在右边找到【启用IntelliTrace】,然后去掉其前面的钩 即可。截图如下: 6.在vs2010命令提示符下,执行devenv.exe /resetuserdata   //这个方法我没有试过 参考文章:http://blog.csdn.net/kupepoem/article/details/6584667 7.禁用VS2010智能提示,即代码提示功能了,如果你安装了VA助手,这个智能提示是可以关闭的。 如果你没有安装VA,建议还是保留该功能吧。 在VS2010中,选择【工具】—-〉〉〉【选项】—-〉〉〉【文本编辑器】—-〉〉〉【C/C++】—-〉〉〉【高级】,在右边找到 【禁用IntelliSense】,选择True即可。截图如下: from:http://blog.163.com/pinbo_jiankun/blog/static/1335464882013102105055396/

龙生   18 May 2015
View Details

解决:Entity Framework + MariaDb(MySql)中文乱码

今天写一MVC4+Entity Framework+Mysql的小例子时,发现中文写到数据库里是N个问号(乱码哦~); 于是跟了一下代码,发现页面提交过来的数据正常,这说明肯定是EF写到数据库时出了问题。 为了进一步验证,我用SQLServer2008试了一下,一切正常,那就在Mysql上找原因吧~ 但mysql库编码也是utf8,表也是utf8,这是什么原因呢? 百度了一把,看 了几篇文章也没能解决我的问题,无非都是要把网页、数据库、EF的编码改一致,我的本来都是一致的,难道是字段的编码?但字段的编码怎么改呢?也没找到方法,忽然看到字段的排序项是空的,会不会是它的原因呢?于是改成utf8——测试——一切正常~有图有真相:

龙生   14 May 2015
View Details

台球游戏的核心算法和AI(1)

前言: 08年的时候, 写过一个台球游戏, 用的是java, 不过代码真的是用传说中的神器notepad写的(你信吗? 其实是用GVIM写的, ^_^), 很多类都在同一java文件中编写. 可见当时的JAVA水平真的不咋地, 时过进迁, 还是一样的不咋地. 这边是当时的CSDN下载链接: java(台球游戏), 实现比较简单. 后来写过一个版本, 比这个要强大许多, 可惜源码丢失了. 效果展示入下图所示: 本文想讲述下台球游戏中核心算法的实现, 以及游戏AI的设计技巧. 当然自己也有个小愿望, 希望能实现一个html5版的台球游戏. 基础物理知识: • 摩擦阻力 其满足牛顿第二定律: f = m * a 速度与加速度关系公式: vt = v0 + a * t 地面摩擦力与运动物体的方向相反, 阻碍物体的向前运动. • 动量守恒 假设物体A质量为m1, 速度为v1, 物体B质量为m2, 速度为v2, 碰撞后速度分别为v1′, v2′. 则满足动量守恒定律: m1 * v1 + m2 * v2 = m1 * v1′ + m2 * v2′ • 碰撞类型和能量守恒定律 1). 完全弹性碰撞 动能没有损失, 则满足如下公式: 1/2 * m1 * v1^2 + 1/2 * m2 * v2^2 = 1/2 * m1 * v1’^2 + 1/2 […]

龙生   12 May 2015
View Details

ASP.NET MVC 模型验证-最舒服的验证方式

在院子里发现 http://www.cnblogs.com/yangecnu/p/3759784.html 模型验证方法 1. 一般方法 繁琐, 无数的if else, 在炎炎夏天,我见过一个验证方法3000行代码的,还要改需求,想必您能了解作为coder当时的心情。 2. 使用第三方框架,功能过于繁琐,还得自己学习,没必要 3. Code Contract 不熟悉,貌似和第三方不同的是:MS提供的,先得高大上一点而已,本质一样 下面的方法,既简单,维护也很方便。代码涉及点: 1) 模型文件代码-添加验证规则,至于你想怎么添加,可以自定义Attribute,或者使用FCL中自带的(本例即是) 2)模型数据操作的Action-在需要验证的Actiond中注入属性或者controller或者全局也行 3)过滤器-添加错误捕捉,处理 维护时,只需要修改各个业务模型中每个字段的验证规则即可 模型建立:

模型数据操作:

from:http://www.cnblogs.com/youlixishi/p/4497462.html

龙生   12 May 2015
View Details

使用 .NET WinForm 开发所见即所得的 IDE 开发环境,实现不写代码直接生成应用程序

直接切入正题,这是我09年到11年左右业余时间编写的项目,最初的想法很简单,做一个能拖拖拽拽就直接生成应用程序的工具,不用写代码,把能想到的业务操作全部封装起来,通过配置的方式把这些业务操作组织起来运行。 项目的核心功能已经基本实现,但12年之后我基本停止了这方面的开发,现在翻出来在这里写出来想和大家交流一下。   鉴于篇幅和精力的原因,请原谅我这篇博文对于技术实现的具体细节谈的不是很多,只能算是一个概述。对业务的说明也不多,我想大家都是技术流,应该一看就明白。 写这个项目的时间是五六年前,现在回过头去看,有很多不足之处,设计上的,技术上的都有,加上当时技术力有限,不足之处还请指正,谢谢。 后续是否会写一个系列的博文详细的分析讲解实现方法,我暂时也没有想好,主要是没有太多时间,我现在基本又回到了当初每天只睡四五个小时的状态。 如果此篇博文有点儿价值,给个推荐呗 ^_^   项目使用了 .Net Framework 3.5 开发,分为两大块: IDE 和 运行时(解析器) IDE中开发的项目在打包后生成 zip 格式的包,解析器通过读取 zip 包实时解析运行,有点类似中间语言的概念,但我这里生成的 zip 包中主要以 xml 文件为主,通过 xml 文件对项目的 UI,业务,数据结构 进行描述。   到此可以看出,运行时本身并不一定是 .Net 或 WinForm 的,而是可以使用任何平台或语言实现,只要读取 zip 文件和 xml 文件并解析即可。 事实上我自己实现的默认运行时也不是 WinForm,而是用了 Silverlight。   再简单说说 IDE 的设计思路,几个主要的设计目标如下:   1.像 Visual Studio 一样 有可视化的环境,拖拖拽拽界面就出来了。 2.模块化设计 功能模块全部独立,解耦,以插件的形式存在于主程序(宿主)中。 2.不要写代码,业务通过界面,向导进行配置 拖一个按钮上去,想要单击时做一件事情,就先把按钮拖上去,然后设置这个按钮的事件序列,配置对应的事件。 3.把事件这个概念抽象并封装起来 如“保存数据”这个事件,配置好数据的来源,如窗体上的数据,或系统数据,再配置好要保存的目标,某种数据实体,即可,这个事件被添加到某个事件序列,如按钮的单击事件序列中,项目被运行时解析时,就会按钮这个逻辑执行。 4.对数据操作要有一定的自由度 除了基本的向导式配置以外,要能满足特殊需求,比如支持自定义 sql 语句。但是自定义 sql 语句怎样与数据源,目标交互呢?我设计了一种简单的表达方法,如 UPDATE FROM [User] SET [Name] = {FormElement.txtName} WHERE [Id]={System.UserId} 5.对数据库数据表的操作怎样交互 就是将其抽象为“数据实体”,数据实体也在 IDE 中由用户自己定义,定义的过程类似于 SqlServer,定义好数据实体以后,在 IDE 中进行设计时,通过数据实体来抽象对数据库、表的操作,在打包项目时,可以根据定义的数据实体,生成多种数据库,如 SqlServer,Mysql 等。 6.资源文件的管理 在项目中必然要引用到外部资源,这部分外部资源,怎样引入,管理,打包呢?我在 IDE 中设计了独立的资源管理器,在 IDE 中设计 […]

龙生   12 May 2015
View Details
1 133 134 135 177