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)
{
}
}
}
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)
{
}
}
}
阅读全文
0 0
- AsyncOperation使用
- C# AsyncOperation类---异步操作
- System.ComponentModel.AsyncOperation类 - 这个类很特别
- 使用
- 使用
- 使用
- 使用
- 使用
- 使用
- 使用++,--
- 使用$@ $!
- 使用
- SoftICE使用(指令使用)
- 使用GraphEdit使用
- 使用HtmlParser使用心得
- 时钟使用使用
- Ubuntu 使用Git 使用
- Ubuntu 使用Git 使用
- Kotlin 初步学习
- Python爬虫:常用浏览器的useragent
- 剑指Offer CountOneInBinary 计算二进制中1的个数
- Python-multiprocessing-Process模块
- JAVA学习札记03
- AsyncOperation使用
- Hadoop文件压缩格式分析和比较
- JSP 文件上传
- ,
- Android内存优化的个人理解
- spring helloworld
- JSP 点击量统计
- 正则表达式-注册表验证
- Eclipse没有Apache tomcat v9.0 的创建选项