110,566
社区成员
发帖
与我相关
我的任务
分享
class C
{
void X()
{
A a = new A();
State state = new State() { A = a };
IAsyncResult result = a.BeginAAA(AReceived, state);
}
void AReceived(IAsyncResult ar)
{
State state = (State)ar.AsyncState;
A a = state.A;
ResultA resA = a.EndAAA(ar);
B b = b.BeginBBB();
state.B = b;
IAsyncResult result = stream.BeginRead(BReceived, state);
}
void BReceived(IAsyncResult ar)
{
State state = (State)ar.AsyncState;
B b = state.B;
ResultB resB = b.EndRead(ar);
DoSomething(resB); // 最终结果
}
}
public class X
{
public void XXXAsync(object userState)
{
lock (_syncRoot)
{
if (_userStates.ContainsKey(userState))
{
throw new ArgumentException("UserState must be unique.");
}
_userStates.Add(userState, false);
}
AAA(uri, userState);
}
public event XXXCompletedEventHandler XXXCompleted;
public void XXXAsyncCancel(object userState)
{
lock (_syncRoot)
{
if (_userStates.ContainsKey(userState))
{
_userStates[userState] = true;
}
}
}
private void AAA(object userState)
{
try
{
A a = new A();
State state = new State(userState);
state.A = a;
if (IsCanceled(state.UserState))
{
RaiseXXXCompleted(null, true, state.UserState);
return;
}
IAsyncResult result = a.BeginAAA(AAACallback, state);
}
catch (Exception ex)
{
RaiseXXXCompleted(ex, false, userState);
}
}
private void AAACallback(IAsyncResult ar)
{
State state = (State)ar.AsyncState;
try
{
A a = state.A;
RA ra = (RA)a.EndAAA(ar);
if (IsCanceled(state.UserState))
{
RaiseXXXCompleted(null, true, state.UserState);
return;
}
state.RA = ra;
B b = ra.GetB();
state.B = b;
IAsyncResult result = b.BeginBBB(BBBCallback, state);
}
catch (Exception ex)
{
RaiseXXXCompleted(ex, false, state.UserState);
}
}
private void BBBCallback(IAsyncResult ar)
{
State state = (State)ar.AsyncState;
try
{
B b = state.B;
RB rb = b.EndBBB(ar);
if (IsCanceled(state.UserState))
{
RaiseXXXCompleted(null, true, state.UserState);
return;
}
var result = DoSomething(rb);
RaiseXXXCompleted(result, state.UserState);
}
catch (Exception ex)
{
RaiseXXXCompleted(ex, false, state.UserState);
}
}
private void RaiseXXXCompleted(string result, object userState)
{
lock (_syncRoot)
{
_userStates.Remove(userState);
}
// RaiseEvent
}
private void RaiseXXXCompleted(Exception error, bool cancelled, object userState)
{
lock (_syncRoot)
{
_userStates.Remove(userState);
}
// RaiseEvent
}
private bool IsCanceled(object userState)
{
lock (_syncRoot)
{
return (_userStates[userState] == false);
}
}
private Dictionary<object, bool> _userStates = new Dictionary<object, bool>();
private object _syncRoot = new object();
}