using System;
using System.Windows.Forms;

namespace Gren.AsyncDemo
{
    
/// <summary>
    
/// 异步操作状态类
    
/// </summary>
    public class AsyncState
    {
        
/// <summary>
        
/// 异步操作异常对象
        
/// </summary>
        public Exception Error { getset; }

        
/// <summary>
        
/// 状态对象
        
/// </summary>
        public object Data { getset; }

    }

    
/// <summary>
    
/// 异步操作的工具类
    
/// </summary>
    public class AsyncUtils
    {
        
private AsyncState state;

        
/// <summary>
        
/// 异步操作状态对象
        
/// </summary>
        public AsyncState State 
        {
            
get { return this.state; } 
        }

        
/// <summary>
        
/// 控件对象
        
/// </summary>
        public Control Control { getset; }

        
/// <summary>
        
/// 异步操作
        
/// </summary>
        public Action<AsyncState> AsyncOperation { getset; }

        
/// <summary>
        
/// 异步操作的回调方法
        
/// </summary>
        public Action<AsyncState> AsyncOperationCallback { getset; }

        
/// <summary>
        
/// 构造函数
        
/// </summary>
        public AsyncUtils()
        {
            
this.state = new AsyncState();
        }

        
/// <summary>
        
/// 开始执行异步操作
        
/// </summary>
        public void BeginInvoke()
        {
            
this.state.Error = null;

            
if (this.Control != null && this.AsyncOperation != null)
            {
                
this.AsyncOperation.BeginInvoke(this.state, new AsyncCallback(this.InvokeCallback), null);
            }
        }

        
/// <summary>
        
/// 执行异步操作的回调方法
        
/// </summary>
        private void InvokeCallback(IAsyncResult ar)
        {
            
try
            {
                
this.AsyncOperation.EndInvoke(ar);
            }
            
catch (Exception ex)
            {
                
this.state.Error = ex;
            }

            
if (this.AsyncOperationCallback != null)
            {
                
if (this.Control.InvokeRequired)
                {
                    
this.Control.Invoke(this.AsyncOperationCallback, this.state);
                }
                
else
                {
                    
this.AsyncOperationCallback(this.state);
                }
            }
            
        }
    }
}

 

 

使用方法

 

Forms窗体中的代码,请自行添加一个button1,一个textBox1

private void button1_Click(object sender, EventArgs e)
        {
            AsyncUtils utils 
= new AsyncUtils();
            utils.Control 
= this;
            utils.State.Data 
= textBox1.Text;

            
//此方法在新的线程中执行
            utils.AsyncOperation = new Action<AsyncState>(state => 
            {
                state.Data 
= "Hello " + state.Data.ToString();
                System.Threading.Thread.Sleep(
3000);

                
//throw new Exception("this is error");
            });

            
//此方法在主线程中执行
            utils.AsyncOperationCallback = new Action<AsyncState>(state => 
            {
                
if (state.Error != null)
                {
                    
this.textBox1.Text = state.Error.Message;
                }
                
else
                {
                    
this.textBox1.Text = state.Data.ToString();
                }
                
            });

            utils.BeginInvoke();
        }

posted on 2010-08-21 14:12  kjunmine  阅读(405)  评论(0编辑  收藏  举报