AsyncOperation使用

来源:互联网 发布:淘宝代购售假申诉 编辑:程序博客网 时间:2024/06/06 19:23
using System;  
using System.Collections.Generic;  
using System.Text;  
using System.ComponentModel;  
using System.Collections.Specialized;  
using System.Threading;  
  
namespace test  
{  
    /// <summary>  
    /// 任务1的进度通知代理  
    /// </summary>  
    /// <param name="sender"></param>  
    /// <param name="e"></param>  
    public delegate void Work1ProgressChangedEventHandler(object sender, Work1ProgressChangedEventArgs e);  
    /// <summary>  
    /// 任务1的进度通知参数  
    /// </summary>  
    /// <param name="sender"></param>  
    /// <param name="e"></param>  
    public delegate void Work1CompletedEventHandler(object sender, Work1CompletedEventArgs e);  
  
    public class BasedEventAsyncWorker  
    {  
        private delegate void WorkerEventHandler(int maxNumber, AsyncOperation asyncOp);  
        private HybridDictionary userStateToLifetime = new HybridDictionary();  
  
        public BasedEventAsyncWorker()  
        { }  
 
        #region DoWork1的基于事件的异步调用  
        public void DoWork1Async(object userState, int maxNumber)  
        {  
            AsyncOperation asyncOp = AsyncOperationManager.CreateOperation(userState);  
  
            //userStateToLifetime有可能会同时被多线程访问,在此需要lock进行同步处理  
            lock (userStateToLifetime.SyncRoot)  
            {  
                if (userStateToLifetime.Contains(userState))  
                {  
                    throw new ArgumentException(  
                        "userState parameter must be unique",  
                        "userState");  
                }  
  
                userStateToLifetime[userState] = asyncOp;  
            }  
  
            //异步开始任务1  
            WorkerEventHandler workerDelegate = new WorkerEventHandler(DoWork1);  
            workerDelegate.BeginInvoke(maxNumber, asyncOp, null, null);  
        }  
  
        private void DoWork1(int maxNumber, AsyncOperation asyncOp)  
        {  
            Exception e = null;  
  
            //判断该userState的任务仍在处理中  
            if (!TaskCanceled(asyncOp.UserSuppliedState))  
            {  
                try  
                {  
                    int n = 0;  
                    int percentage = 0;  
                    while (n < maxNumber && !TaskCanceled(asyncOp.UserSuppliedState))  
                    {  
                        Thread.Sleep(100); //模拟耗时操作  
                        percentage = (int)((float)n / (float)maxNumber * 100);  
                        Work1ProgressChangedEventArgs progressChanageArgs =  
                            new Work1ProgressChangedEventArgs(maxNumber, percentage, asyncOp.UserSuppliedState);  
                        //任务1的进度通知  
                        asyncOp.Post(new SendOrPostCallback(Work1ReportProgressCB), progressChanageArgs);   
                        n++;  
                    }  
                }  
                catch (Exception ex)  
                {  
                    e = ex;  
                }  
            }  
  
            this.Work1Complete(e, TaskCanceled(asyncOp.UserSuppliedState), asyncOp);  
        }  
  
        private void Work1Complete(Exception exception, bool canceled, AsyncOperation asyncOp)  
        {  
            if (!canceled)  
            {  
                lock (userStateToLifetime.SyncRoot)  
                {  
                    userStateToLifetime.Remove(asyncOp.UserSuppliedState);  
                }  
            }  
  
            Work1CompletedEventArgs e = new Work1CompletedEventArgs(exception, canceled, asyncOp.UserSuppliedState);  
  
            //通知指定的任务已经完成  
            asyncOp.PostOperationCompleted(new SendOrPostCallback(Work1CompleteCB), e);  
  
            //调用 PostOperationCompleted 方法来结束异步操作的生存期。  
            //为某个特定任务调用此方法后,再调用其相应的 AsyncOperation 对象会引发异常。  
        }  
  
        private void Work1ReportProgressCB(object state)  
        {  
            Work1ProgressChangedEventArgs e = state as Work1ProgressChangedEventArgs;  
  
            OnWork1ProgressChanged(e);  
        }  
  
        private void Work1CompleteCB(object state)  
        {  
            Work1CompletedEventArgs e = state as Work1CompletedEventArgs;  
  
            OnWork1Completed(e);  
        }  
 
        #region Work1的进度通知和任务完成的事件  
        public event Work1ProgressChangedEventHandler Work1ProgressChanged;  
        protected virtual void OnWork1ProgressChanged(Work1ProgressChangedEventArgs e)  
        {  
            Work1ProgressChangedEventHandler temp = this.Work1ProgressChanged;  
            if (temp != null)  
            {  
                temp(this, e);  
            }  
        }  
  
        public event Work1CompletedEventHandler Work1Completed;  
        protected virtual void OnWork1Completed(Work1CompletedEventArgs e)  
        {  
            Work1CompletedEventHandler temp = this.Work1Completed;  
            if (temp != null)  
            {  
                temp(this, e);  
            }  
        }   
        #endregion   
        #endregion  
  
        /// <summary>  
        /// 取消指定userState的任务执行  
        /// </summary>  
        /// <param name="userState"></param>  
        public void CancelAsync(object userState)  
        {  
            AsyncOperation asyncOp = userStateToLifetime[userState] as AsyncOperation;  
            if (asyncOp != null)  
            {  
                lock (userStateToLifetime.SyncRoot)  
                {  
                    userStateToLifetime.Remove(userState);  
                }  
            }  
        }  
  
        /// <summary>  
        /// 判断指定userState的任务是否已经被结束。返回值:true 已经结束; false 还没有结束  
        /// </summary>  
        /// <param name="userState"></param>  
        /// <returns></returns>  
        private bool TaskCanceled(object userState)  
        {  
            return (userStateToLifetime[userState] == null);  
        }  
  
  
    }  
  
    public class Work1ProgressChangedEventArgs :ProgressChangedEventArgs  
    {  
        private int totalWork = 1;  
  
        public Work1ProgressChangedEventArgs(int totalWork, int progressPercentage, object userState)  
            : base(progressPercentage, userState)  
        {  
            this.totalWork = totalWork;  
        }  
  
        /// <summary>  
        /// Work1的总工作量  
        /// </summary>  
        public int TotalWork  
        {  
            get  
            {  
                return totalWork;  
            }  
        }  
    }  
  
    public class Work1CompletedEventArgs : AsyncCompletedEventArgs  
    {  
        public Work1CompletedEventArgs(Exception e, bool canceled, object state)  
            : base(e, canceled, state)  
        {  
        }  
  
    }  
  
}