C#匿名方法的应用二则–实现异常Retry机制和WinForm线程安全访问

本文介绍了如何使用C#的匿名方法实现Retry机制,以处理可能出现的网络异常,以及如何在WinForm中进行线程安全的Control访问。Retry机制通过循环和异常处理,避免频繁的异常抛出,而线程安全访问则是通过一个通用的DoThreadSafe函数,利用匿名方法避免了多次写入同一操作,提高了代码的优雅性和可维护性。
摘要由CSDN通过智能技术生成

用C# 2.0的朋友可能会经常使用匿名方法(Anonymous Methods)和匿名委托(Anonymous Delegate)。在这里我说2个比较常用的应用环境。

1、Retry机制

C#和C++, Java一样拥有异常处理机制,我相信很多朋友和我一样,第一次接触异常的时候,都非常希望异常能够像内核捕获内存page fault异常一样类似的拥有Retry(重试)的机制,很可惜这些语言中都没有给我们提供Retry机制。

当然原因有很多,比如如果重试,那么到底是重试哪部分代码呢?是try{}catch{}中的代码?还是发生异常那一行的代码?重试多少次?重试之间是不是要再等一会儿?如果再失败怎么处理?而且如果不同层有Retry,那么会出现Retry次数以乘法形式递增(底层Retry 5次,高层Retry 3次,那么实际Retry次数将达到15次)。

在应用环境中的Retry不比内核,处理后只需要重新执行产生异常的那一条指令,应用环境的要求要更复杂。

可是在实际应用中,特别是面对网络应用时候,有可能会有大量的类似于TimeOut(超时)、或者外部资源被临时占用、暂时性的设备较忙的异常产生,只要再重试几次就会正常。如果此时将raise异常,并且扔向更高层,显然是不太明智的。于是就开始有人用有限次循环的办法来模拟Retry。典型的代码如下:


  
  
  
     public   static   void  TraditionalSolution()
    
{
        
int retryTimes = 10;
        
        
for (int i = 0; i < retryTimes; ++i)
        
{
            
try
            
{
                
//    do something here, 
                
//    such as call WebClient to fetch a webpage.
                
//    the code might throw an exception.
                break;
            }

            
catch (Exception)
            
{
                
if (i == retryTimes - 1)
                
{
                    
throw;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值