110,536
社区成员
发帖
与我相关
我的任务
分享
// 使用异步委托代替线程
public delegate void MyDelegate();
// 假设开三个异步线程。。。
// 构造一个计数器类对象,并将总数线程设置为3
MyCount mc = new MyCount(3);//你可以再次封装,将总数计数器自动化
MyDelegate md1 = new MyDelegate(this.MyDelegateMethon);
md1.BeginInvoke(new AsyncCallback(this.MyDelegateCompleted), mc);
MyDelegate md2 = new MyDelegate(this.MyDelegateMethon);
md2.BeginInvoke(new AsyncCallback(this.MyDelegateCompleted), mc);
MyDelegate md3 = new MyDelegate(this.MyDelegateMethon);
md3.BeginInvoke(new AsyncCallback(this.MyDelegateCompleted), mc);
// 你的实现方法
private void MyDelegateMethon()
{
// 你的操作。。。。。。
int n = 0;
}
// 异步委托完成事件
private void MyDelegateCompleted(IAsyncResult ar)
{
MyCount mc = (MyCount)ar.AsyncState;
AsyncResult result = (AsyncResult)ar;
MyDelegate md = (MyDelegate)result.AsyncDelegate;
md.EndInvoke(ar);
// 判断所有线程是否完成
if (mc.IsCompleted())
{
// 你的设置代码。。。
int n = 0;
}
}
public class MyCount
{
// 计数器
private long m_lCount = 0L;
// 总数
private long m_lTotal = 0L;
/// <summary>
///
/// </summary>
/// <param name="lTotal"></param>
public MyCount(long lTotal)
{
this.m_lTotal = lTotal;
}
// 是否全部线程已经完成
public bool IsCompleted()
{
Interlocked.Increment(ref this.m_lCount);
if (Interlocked.Read(ref this.m_lCount) == this.m_lTotal)
{
Interlocked.Exchange(ref this.m_lCount, 0L);
return true;
}
return false;
}
}