kevin-Y

置顶随笔 #

[置顶][NHFrog]发布第三个版本_NHibernate嵌入式代码生成器

摘要: 安装后,VS.NET2005、VS.NET2008都能用。http://files.cnblogs.com/kevin-Y/NHFrogWizard3.0.zip1.导入结构时统一导到一个“导入实体”目录下2.针对平时使用的方便性修改3.增加“基础实体”、“接口型基础实体”。定义表在结构上的继承关系。更为祥细说明,请看第一版[...阅读全文

posted @ 2008-11-20 17:05 生命体验之kevin-Y 阅读(393) 评论(1) 编辑

2011年12月1日 #

remoting怪现象。方法长时间不返回,也不报异常。

功能:下载文件。

方式:调用Remoting方法,得到整个文件的字节数组,写到本地文件。

代码:

public static bool DownloadFromTestPool(string pFileName, string pLocalFullPath)
{
bool isOk = true;
System.IO.FileStream write = null;
try
{
System.IO.FileInfo file = new FileInfo(pLocalFullPath);
if (!file.Directory.Exists)
file.Directory.Create();

byte[] buffer = Factory.MessionFacade.DownFromTestPool(pFileName);//Factory.MessionFacade为Remoting远程代理
write = new FileStream(pLocalFullPath, FileMode.Create);
write.Write(buffer, 0, buffer.Length);
}
catch (Exception ex)
{
isOk = false;
GeneralMethod.HandleException(ex);
}
finally
{
if (write != null)
write.Close();
}
return isOk;
}

以上方法多次使用都没有问题。但近来出现了一个怪现象。连续下载多个文件时,一般在第三个文件,以下这行代码会长时间无返回,也不抛异常,相当的无奈。

byte[] buffer = Factory.MessionFacade.DownFromTestPool(pFileName);//Factory.MessionFacade为Remoting远程代理

心想是不是一次的字节数组过大,在某些公网的情况下会有问题呢? 改为使用断点分次下载,情况依旧。由于方法是长时间不返回且无异常,只好利用异步超时的方式去检测这种情况,并重新调用Remoting方法方法。

断点分次异步重连
public class SyncDownloader
{

public delegate byte[] DownloadBytesHandle(string pFileName, long pPosition, int pMaxSize);

System.IO.FileStream write = null;
long pos = 0;
int lastReceiveSize = 0;
int bufferVersion = 0;
SyncDownloadItem curDown;
public SyncDownloader()
{

}
private ManualResetEvent timeoutObject = new ManualResetEvent(false);

public bool StartDownload(string fileName, string localFullPath)
{
int buffersize = 50000;//默认500K一次 25000 12500 6000 3000 1500
bufferVersion = 0;
pos = 0;
lastReceiveSize = buffersize;//默认与最大的一致
bool isOk = false;
int timeoutTimes = 0;//超时20次退出下载。

try
{
System.IO.FileInfo file = new FileInfo(localFullPath);
if (!file.Directory.Exists)
file.Directory.Create();
write = new FileStream(localFullPath, FileMode.Create);
while (true)
{
timeoutObject.Reset();
if (lastReceiveSize < buffersize)
break;
bufferVersion++;

//异步下载
DownloadBytesHandle fh = new DownloadBytesHandle(this.dwonloadBytes);
AsyncCallback callback = new AsyncCallback(this.downloadCallback);
IAsyncResult ar = fh.BeginInvoke(fileName, pos, buffersize, callback, bufferVersion);

if (!timeoutObject.WaitOne(10000))//10秒应能下载完成
{
timeoutTimes++;
Console.Write("_{0}", timeoutTimes); //超时加下划线
if (timeoutTimes > 20)
break;
//超时
if (buffersize > 3000)//10秒无论如何都应能下载1.5K
buffersize = buffersize / 2;//超时下载尺寸减半。
}
else
{
byte[] buffer = fh.EndInvoke(ar);
Console.Write(".");//不断的加点
write.Write(buffer, 0, buffer.Length);
pos += buffer.Length;
lastReceiveSize = buffer.Length;
}
}
isOk = true;
}
catch (Exception ex)
{
isOk = false;
GeneralMethod.HandleException(ex);
}
finally
{
if (write != null)
write.Close();
}
return isOk;
}
public void downloadCallback(IAsyncResult ar)
{
int dbVer = Convert.ToInt32(ar.AsyncState);
if (dbVer == this.bufferVersion)//只有当次调用才释放
timeoutObject.Set();
}

public byte[] dwonloadBytes(string pFileName, long pPosition, int pMaxSize)
{
//System.Threading.Thread.Sleep(11000);//睡11秒。判断是否还会执行。
byte[] buffer = null;
try
{
buffer = Factory.AreaIssueFacade.DownFromTestPool(pFileName, pPosition, pMaxSize);
}
catch { }//忽略所有错误
return buffer;
}
}

 

利用上面的代码,下载4个文件,以下是过程日志。每一个点代表一次成功调用,下划线代表超时,下划线后面的数字代表第几次超时。

开始从发布服务器下载文件..
下载HIS.Mattgr.UI.dll.......... 从发布服务器下载成功
下载HIS.Mattgr.Services.dll............ 从发布服务器下载成功
下载HIS.Mattgr.Interface.dll_1_2_3......... 从发布服务器下载成功
下载HIS.PublicMattgr.Services.dll......... 从发布服务器下载成功

每次的日志都显示在第三个文件一开始都会有连续的三次调用超时,而之后又会很快。真走运,如此稳定的异常情况。

posted @ 2011-12-01 23:15 生命体验之kevin-Y 阅读(12) 评论(0) 编辑

2011年9月8日 #

找了一段生成ClickOne的快捷方式的生成代码

摘要: 找了一段生成ClickOne的快捷方式的生成代码,晚上回去试试能否可用。阅读全文

posted @ 2011-09-08 10:23 生命体验之kevin-Y 阅读(14) 评论(0) 编辑

2011年6月10日 #

持续集成好工具CruiseControl.Net

我不希望程序员各自编译一份dll来发布,希望由统一的一台机器自动获取源代码并自动生成发布的文件。

原来这叫持续集成。这是园内的文章。这里收藏一下。

http://www.cnblogs.com/cnblogsfans/archive/2008/04/24/1169689.html

http://www.cnblogs.com/greatqn/archive/2008/08/05/1261298.html

posted @ 2011-06-10 12:01 生命体验之kevin-Y 阅读(28) 评论(0) 编辑

2011年5月20日 #

如果取出绑定到事件的方法数量

// 事件访问器的定义
int eventCount=0;
public event EventHandler NumberChanged {
add {
eventCount
++;
numberChanged
= value;
}
remove {
eventCount
--;
numberChanged
-= value;
}
}

或取委托数组
public event EventHandler NumberChanged;
//某个方法内
Delegate[] delegates = NumberChanged.GetInvocationList();

posted @ 2011-05-20 17:49 生命体验之kevin-Y 阅读(13) 评论(0) 编辑

2011年3月12日 #

AppDomain加载与释放dll

几年前写过同名随笔,但今天应不大适用了。但还有几个朋友留言关注,我重新发布相关代码。

首先我们的目的就是运行期间更新dll,并应用dll。这个过程需要应用 AppDomain来解决,办法就是创建新的AppDomain加载dll,并在dll更新后创建新的AppDomain来加载新的dll。

好了,我们有两个目录需要完成。

第一个目标:运行时能更新dll。

1.创建AppDomain时设置ShadowCopyFiles

AppDomainSetup _setup = new AppDomainSetup();
_setup.ShadowCopyFiles
= "true";
_setup.LoaderOptimization
= LoaderOptimization.SingleDomain;
AppDomain _curDomain
= AppDomain.CreateDomain("TestDomain", null, _setup);

 2.当我们的主程序需要引用动态加载dll中的某个对象的实例时,该实例必须创建为代理类。代理类的意思是类需要继承自MarshalByRefObject。此外一般会使用另一个公共类库定义基类或接口来使用这个代理类。好了,先看怎么样在前面创建的程序域中创建代理类的实例

System.Runtime.Remoting.ObjectHandle objHandle = pJobDomain.CreateInstanceFrom(strDllFilePath, strClassName);
object objBuild = objHandle.Unwrap();

if (objBuild == null)
throw new Exception("buildWorker -- 创建对象失败");
else
ido
= (IDo)objBuild;//IDo是一个接口

 好了,如果strDllFilePath=“ClassLibrary.dll”,那么运行目录的ClassLibrary.dll文件被加载后,我们还是可以随便更新他的。但更新后,程序域不重新创建的话,使用上面的方法再次创建代理实例,我们的程序依然看不到新的dll的运行效果的,因为我们加载时设置了ShadowCopyFiles="true"。当然你可能会说设置为"false"行不行呢?你可以试试,但我要说的是,如果这样的话,我们第一个目标都完成不了。

第二个目标:应用新的dll。

其实很简单,UnLoad后再创建一次,使用新的AppDomain创建代理类 ,程序就能看到新dll的效果。好,我定义了一个方法保证每运行一次都会创建一个新的程序域

AppDomain _curDomain;
private void load()
{
if (_curDomain != null)//已创建了程序域
{
AppDomain.Unload(_curDomain);
//先关闭再打开。
_curDomain = null;
}
AppDomainSetup _setup
= new AppDomainSetup();
_setup.ShadowCopyFiles
= "true";
_setup.LoaderOptimization
= LoaderOptimization.SingleDomain;
_curDomain
= AppDomain.CreateDomain("TestDomain", null, _setup);
}

 提供一个kevin-y的测试的源代码 给大家下载

posted @ 2011-03-12 11:49 生命体验之kevin-Y 阅读(220) 评论(1) 编辑

导航

统计信息

News

搜索

 
 

常用链接

我的标签

随笔分类

随笔档案

文章分类

关注站点

最新评论

阅读排行榜

评论排行榜

推荐排行榜