AsyncOperation使用

xiaoxiao2021-02-27  223

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)           {           }          }      }  
转载请注明原文地址: https://www.6miu.com/read-10983.html

最新回复(0)