随笔分类 -  .NET

Delegate和Event区别
摘要:.本文将讨论委托和事件一些更为细节的问题,包括一些大家常问到的问题,以及事件访问器、异常处理、超时处理和异步方法调用等内容。 为什么要使用事件而不是委托变量?在 C#中的委托和事件 中,我提出了两个为什么在类型中使用事件向外部提供方法注册,而不是直接使用委托变量的原因。主要是从封装性和易用性上去考虑,但是还漏掉了一点,事件应该由事件发布者触发,而不应该由客户端(客户程序)来触发。这句话是什么意思呢?请看下面的范例:NOTE:注意这里术语的变化,当我们单独谈论事件,我们说发布者(publisher)、订阅者(subscriber)、客户端(client)。当我们讨论Observer模式,我们说主 阅读全文

posted @ 2011-04-20 09:56 pjh123 阅读(217) 评论(0) 推荐(0)

.Net Remoting学习
摘要:1、服务器端服务程序启动后,建立服务器端通道;这个通道的名称是固定的。2、任何客户端(包括OCC、接收端),调用服务器端远程对象时,都先建立通道。 目前的做法是,每个调用都做,都是先建立通道、执行调用、注销通道。也就是说客户端不维持通道。那么就存在客户端同时需要建立两个通道的情况,TcpClientChannel 要求如果要注册多个信道,则每个信道都必须具有唯一的名称,即名称不能重复。 这是不是就是客户端不停的生成通道名称的原因? 现在不却确定的是,客户端为什么在应用程序的声明周期内,不维持一个通道?二、 一个通道可以建多个远程对象,但是注册时,必须指定不同的URI。如果用同一个URI注册,后 阅读全文

posted @ 2011-04-20 09:51 pjh123 阅读(423) 评论(0) 推荐(0)

C# 用户自定义UserControl控件使用
摘要:1、UserControl控件。 添加UserControl后,按照说法应该出现在ToolBox中,如果找不到,需要设置: 工具-》选项-》Windows窗体设计器-》常规-》工具箱-》AutoToolBoxPopulate 改为TRUE。 这种方法不会针对这个UserControl生成dll。 还有一种方法是,新建一个UserControl工程,这个工程会生成一个控件的dll,在引用工程的ToolBox中,右键->Choose Items 阅读全文

posted @ 2011-04-20 09:38 pjh123 阅读(4450) 评论(1) 推荐(1)

构造函数之——静态构造函数
摘要:静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。静态构造函数具有以下特点:静态构造函数既没有访问修饰符,也没有参数。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。 无法直接调用静态构造函数。在程序中,用户无法控制何时执行静态构造函数。静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。理解以上内容,请调试、分析如下程序:using System;us 阅读全文

posted @ 2011-03-24 18:00 pjh123 阅读(273) 评论(0) 推荐(0)

使用事件AutoResetEvent/ManualResetEvent
摘要:假如一个线程处理任务,保持了一个任务队列;其它几个线程向该任务队列中添加任务。我们要保证这个任务队列不能过大,比如每一个时刻,只能有3个任务在队列中,使用事件(AutoResetEvent/ManualResetEvent)机制如下:namespace ManualResetEventTest{ class Program { static void Main(string[] args) { Process processObj = new Process(); ThreadStart newProcessStart = new ThreadStart(processObj.ProcessT 阅读全文

posted @ 2011-03-22 18:16 pjh123 阅读(285) 评论(0) 推荐(0)

.Net Remoting 2 (一个奇怪的错误)
摘要:现象描述如下:1、服务端采用TcpServerChannel,通道名称默认(注:默认情况下系统会定义为'tcp')2、客户端在程序启动时,注册一个通道,类型为TcpChannel,并且指定通道名称为'client'。然后客户端通GetObject获得远程对象,并注册服务器端事件。问题描述:1、客户端非法关闭几次后,在客户端报异常"The channel 'tcp' is already registered." 在GetObject之前、之后进行更正,发现没有"tcp"名称的通道存在。所以不清楚程序为什么会做出这样的提示。 但是跟踪当前客户端的所有通道,并没有发现名称为tcp的通道,只有一个名 阅读全文

posted @ 2011-02-18 17:40 pjh123 阅读(261) 评论(1) 推荐(1)

.Net Remoting 1
摘要:以下写的并不是通道的基础知识,而是一些思考,并且需要经过实际程序验证。一、服务器端1、服务器端通道必须是TcpChannel或者TcpServerChannel这两种类对象。2、服务器端同一端口,不能同时注册多个通道;3、一个通道可以建多个远程对象,但是注册时,必须指定不同的URI。如果用同一个URI注册,后面的对象会覆盖前面的对象。例如: RemotingConfiguration.RegisterWellKnownServiceType(typeof(AnotherObj), "BroadCastMessage.soap", WellKnownObjectMode.Singleton); 阅读全文

posted @ 2011-02-18 17:39 pjh123 阅读(186) 评论(0) 推荐(0)

C# 通过事件触发UI的问题
摘要:关于事件调用与直接调用的区别:环境是这样的,在MainForm中,有个函数,如下:public void GetMessage(string str){ ... //执行创建控件的操作}该函数注册了另外一个对象(obj)的事件,即obj.localEvent += new BroadCastEventHandler(GetMessage);//BroadCastEventHandler是个委托出现了一下情况:操作1:当通过MainForm的UI,执行GetMessage函数时,该函数完全正常,创建了新控件。操作2:当通过事件触发GetMessage函数时,该函数不正常,新控件无法创建,奇怪的现 阅读全文

posted @ 2011-02-12 18:02 pjh123 阅读(431) 评论(0) 推荐(0)

.net Remoting
摘要:.Net Remoting常用的远程对象激活模式是服务器端激活模式,又叫做WellKnow方式。服务器端激活模式又分两种,分别是:SingleTon、和SingleCallSingleTon、和SingleCall的区别如下:1、SingleTon模式:此为有状态模式。如果设置为SingleTon激活方式,则Remoting将为所有客户端建立同一个对象实例。2、SingleCall模式:SingleCall是一种无状态模式。一旦设置为SingleCall模式,则当客户端调用远程对象的方法时,Remoting会为每一个客户端建立一个远程对象实例,至于对象实例的销毁则是由GC自动管理的。对于服务器 阅读全文

posted @ 2010-12-29 18:18 pjh123 阅读(336) 评论(0) 推荐(0)

Socket Remoting WebService WCF
摘要:引用:http://blog.csdn.net/luminji/archive/2009/10/15/4676560.aspxremoting与socket、webservice和wcf的比较及优势1:socket VS remoting 使用socket无疑是效率最高的。但是,在复杂的接口环境下,socket的开发效率也是最低的。故在兼顾开发效率的情况下,可以使用remoting来代替socket开发。并且: 1、Tcp通道的Remoting速度非常快。 你可以通过端口查看工具,发现remoting比直接socket传输的内容,应该是属于同一个数量级的。我的另一个担心是,大客户端数量的情况下 阅读全文

posted @ 2010-12-28 18:25 pjh123 阅读(1411) 评论(0) 推荐(1)

C#中的Invoke和BeginInvoke
摘要:一、关于Invoke和BeginInvoke 有一篇文章说通过BeginInvoke给线程函数传参数,如下class ThreadOperation { public delegate void myDelegate(int count, string str); public void StartThread() { myDelegate dele = new myDelegate(Func2); dele.BeginInvoke(1, "test"); } public void Func2(int count, string str) { Console.WriteLine(string 阅读全文

posted @ 2010-12-16 17:39 pjh123 阅读(290) 评论(0) 推荐(0)

C#中启动线程时,如何传递参数
摘要:创建线程,并传递参数的方法:方法一: 使用Thread类的 public Thread (ThreadStart start)构造函数; 举例:(参考MSDN) class Test{ static void Main() { Thread newThread = new Thread(new ThreadStart(Work.DoWork)); newThread.Start(); }}class Work { Work() {} //这里可以自己定义线程执行函数需要的参数 public static void DoWork() {}}这种方法的特点是,不直接给线程函数传递参数,而是通过 阅读全文

posted @ 2010-12-16 17:38 pjh123 阅读(1015) 评论(0) 推荐(0)

小常识
摘要:1、如何快速输出 在C#的winForm程序中,使用Console,可以快速的在output窗口中输出信息; 同样,在VC++中,也可以输出,不过不是Console,也不是cout,而是OutputDebugString()函数 阅读全文

posted @ 2010-12-15 09:37 pjh123 阅读(124) 评论(0) 推荐(0)

委托与事件
摘要:http://dev.tot.name/csharp/html/2010029/20100209103147.htm一、使用事件的好处 在以往我们编写这类程序中,往往采用等待机制,为了等待某件事情的发生,需要不断地检测某些判断变量,而引入事件编程后,大大简化了这种过程: - 使用事件,可以很方便地确定程序执行顺序。 - 当事件驱动程序等待事件时,它不占用很多资源。事件驱动程序与过程式程序最大的不同... 阅读全文

posted @ 2010-05-09 08:50 pjh123 阅读(213) 评论(0) 推荐(0)

线程同步,使用ManualResetEvent 和 AutoResetEvent
摘要:ManualResetEventSet()方法将状态设置为有信号Reset()将其设置为无信号WaitOne()将阻塞到其有信号为止,若调用WaitOne的时刻就是有信号的,将不会阻塞 AutoResetEvent与ManualResetEvent的区别是,AutoResetEvent.WaitOne()会自动改变事件对象的状态,即AutoResetEvent.WaitOne()每执行一次,事件的... 阅读全文

posted @ 2010-05-02 18:19 pjh123 阅读(248) 评论(0) 推荐(0)

如何跨越线程调用窗体控件?(4)
摘要:一、前言VS中,如果UI背后的处理工作复杂,可以启用多线程进行处理,用户不喜欢反应慢的程序。在执行耗时较长的操作时,使用多线程是明智之举,它可以提高程序 UI 的响应速度,使得一切运行显得更为快速。那么如果在UI上反应最新的处理状态呢?这就是如果在子线程(即新开启的处理复杂任务的线程)中更新UI处理状态信息。二、其它方法private Thread myThread; private void F... 阅读全文

posted @ 2010-04-10 16:05 pjh123 阅读(141) 评论(0) 推荐(0)

如何跨越线程调用窗体控件?(3)
摘要:一、前言VS中,如果UI背后的处理工作复杂,可以启用多线程进行处理,用户不喜欢反应慢的程序。在执行耗时较长的操作时,使用多线程是明智之举,它可以提高程序 UI 的响应速度,使得一切运行显得更为快速。那么如果在UI上反应最新的处理状态呢?这就是如果在子线程(即新开启的处理复杂任务的线程)中更新UI处理状态信息二、通过设置Form属性System.Windows.Forms.Control.Check... 阅读全文

posted @ 2010-04-10 15:57 pjh123 阅读(250) 评论(0) 推荐(0)

如何跨越线程调用窗体控件?(2)
摘要:一、前言VS中,如果UI背后的处理工作复杂,可以启用多线程进行处理,用户不喜欢反应慢的程序。在执行耗时较长的操作时,使用多线程是明智之举,它可以提高程序 UI 的响应速度,使得一切运行显得更为快速。那么如果在UI上反应最新的处理状态呢?这就是如果在子线程(即新开启的处理复杂任务的线程)中更新UI处理状态信息。二、使用Invoke 引用:http://dev.tot.name/csharp/html... 阅读全文

posted @ 2010-04-10 15:34 pjh123 阅读(1011) 评论(0) 推荐(0)

如何跨越线程调用窗体控件?(1)
摘要:一、前言VS中,如果UI背后的处理工作复杂,可以启用多线程进行处理,用户不喜欢反应慢的程序。在执行耗时较长的操作时,使用多线程是明智之举,它可以提高程序 UI 的响应速度,使得一切运行显得更为快速。那么如果在UI上反应最新的处理状态呢?这就是如果在子线程(即新开启的处理复杂任务的线程)中更新UI处理状态信息。二、本节介绍最简单的方法。 在主线程中,定义一个子线程处理的对象,通过主线程启动子线程。然... 阅读全文

posted @ 2010-04-10 15:14 pjh123 阅读(279) 评论(0) 推荐(0)

C# 字符串 与 DateTime的转换
摘要:string time = "110018";//时间字符串 string span = "53"; int span2 = 530; DateTime dt1 = DateTime.ParseExact(time, "HHmmss", null); DateTime dt2 = DateTime.ParseExact(span, "mm", null); TimeSpan sp1 = new ... 阅读全文

posted @ 2010-02-22 16:12 pjh123 阅读(489) 评论(0) 推荐(0)