Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / MS / Internal / Data / AsyncDataRequest.cs / 1305600 / AsyncDataRequest.cs
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
// Description: Defines a request to the async data system.
//
// Specs: http://avalon/connecteddata/M5%20Specs/Asynchronous%20Data%20Model.mht
//
//---------------------------------------------------------------------------
using System;
namespace MS.Internal.Data
{
/// Type for the work and completion delegates of an AsyncDataRequest
internal delegate object AsyncRequestCallback(AsyncDataRequest request);
/// Status of an async data request.
internal enum AsyncRequestStatus
{
/// Request has not been started
Waiting,
/// Request is in progress
Working,
/// Request has been completed
Completed,
/// Request was cancelled
Cancelled,
/// Request failed
Failed
}
/// A request to the async data system.
internal class AsyncDataRequest
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
/// Constructor
internal AsyncDataRequest( object bindingState,
AsyncRequestCallback workCallback,
AsyncRequestCallback completedCallback,
params object[] args
)
{
_bindingState = bindingState;
_workCallback = workCallback;
_completedCallback = completedCallback;
_args = args;
}
//------------------------------------------------------
//
// Public Properties
//
//-----------------------------------------------------
/* unused by default scheduler. Restore for custom schedulers.
/// The "user data" from the binding that issued the request.
public object BindingState { get { return _bindingState; } }
*/
/// The result of the request (valid when request is completed).
public object Result { get { return _result; } }
/// The status of the request.
public AsyncRequestStatus Status { get { return _status; } }
/// The exception (for a failed request).
public Exception Exception { get { return _exception; } }
//------------------------------------------------------
//
// Public Methods
//
//------------------------------------------------------
/// Run the request's work delegate and return the result.
///
/// This method should be called synchronously on a worker thread, as it
/// calls the work delegate, which potentially takes a long time. The
/// method sets the status to "Working". It is normally followed by a
/// call to Complete.
///
/// If the request has already been run or has been abandoned, this method
/// returns null.
///
public object DoWork()
{
if (DoBeginWork() && _workCallback != null)
return _workCallback(this);
else
return null;
}
/// If the request is in the "Waiting" state, return true and
/// set its status to "Working". Otherwise return false.
///
///
/// This method is thread-safe and works atomically. Therefore only
/// one thread will be permitted to run the request.
///
public bool DoBeginWork()
{
return ChangeStatus(AsyncRequestStatus.Working);
}
/// Set the request's status to "Completed", save the result,
/// and call the completed delegate.
///
/// This method should be called on any thread, after
/// either calling DoWork or performing the work for a request in some
/// other way.
///
/// If the request has already been run or has been abandoned, this method
/// does nothing.
///
public void Complete(object result)
{
if (ChangeStatus(AsyncRequestStatus.Completed))
{
_result = result;
if (_completedCallback != null)
_completedCallback(this);
}
}
/// Cancel the request.
/// This method can be called from any thread.
/// Calling Cancel does not actually terminate the work being
/// done on behalf of the request, but merely causes the result
/// of that work to be ignored.
///
public void Cancel()
{
ChangeStatus(AsyncRequestStatus.Cancelled);
}
/// Fail the request because of an exception.
/// This method can be called from any thread.
public void Fail(Exception exception)
{
if (ChangeStatus(AsyncRequestStatus.Failed))
{
_exception = exception;
if (_completedCallback != null)
_completedCallback(this);
}
}
//-----------------------------------------------------
//
// Internal properties
//
//------------------------------------------------------
/// The caller-defined arguments.
internal object[] Args { get { return _args; } }
//-----------------------------------------------------
//
// Private methods
//
//-----------------------------------------------------
// Change the status to the new status. Return true if this is allowed.
// Do it all atomically.
bool ChangeStatus(AsyncRequestStatus newStatus)
{
bool allowChange = false;
lock(SyncRoot)
{
switch (newStatus)
{
case AsyncRequestStatus.Working:
allowChange = (_status == AsyncRequestStatus.Waiting);
break;
case AsyncRequestStatus.Completed:
allowChange = (_status == AsyncRequestStatus.Working);
break;
case AsyncRequestStatus.Cancelled:
allowChange = (_status == AsyncRequestStatus.Waiting) ||
(_status == AsyncRequestStatus.Working);
break;
case AsyncRequestStatus.Failed:
allowChange = (_status == AsyncRequestStatus.Working);
break;
}
if (allowChange)
_status = newStatus;;
}
return allowChange;
}
//-----------------------------------------------------
//
// Private data
//
//------------------------------------------------------
AsyncRequestStatus _status;
object _result;
object _bindingState;
object[] _args;
Exception _exception;
AsyncRequestCallback _workCallback;
AsyncRequestCallback _completedCallback;
object SyncRoot = new object(); // for synchronization
}
/// Async request to get the value of a property on an item.
internal class AsyncGetValueRequest : AsyncDataRequest
{
//-----------------------------------------------------
//
// Constructors
//
//------------------------------------------------------
/// Constructor.
internal AsyncGetValueRequest( object item,
string propertyName,
object bindingState,
AsyncRequestCallback workCallback,
AsyncRequestCallback completedCallback,
params object[] args
)
: base(bindingState, workCallback, completedCallback, args)
{
_item = item;
_propertyName = propertyName;
}
//------------------------------------------------------
//
// Public Properties
//
//-----------------------------------------------------
/// The item whose property is being requested
public object SourceItem { get { return _item; } }
/* unused by default scheduler. Restore for custom schedulers.
/// The name of the property being requested
public string PropertyName { get { return _propertyName; } }
*/
//------------------------------------------------------
//
// Private data
//
//-----------------------------------------------------
object _item;
string _propertyName;
}
/// Async request to set the value of a property on an item.
internal class AsyncSetValueRequest : AsyncDataRequest
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
/// Constructor.
internal AsyncSetValueRequest( object item,
string propertyName,
object value,
object bindingState,
AsyncRequestCallback workCallback,
AsyncRequestCallback completedCallback,
params object[] args
)
: base(bindingState, workCallback, completedCallback, args)
{
_item = item;
_propertyName = propertyName;
_value = value;
}
//------------------------------------------------------
//
// Public Properties
//
//-----------------------------------------------------
/// The item whose property is being set
public object TargetItem { get { return _item; } }
/* unused by default scheduler. Restore for custom schedulers.
/// The name of the property being set
public string PropertyName { get { return _propertyName; } }
*/
/// The new value for the property
public object Value { get { return _value; } }
//------------------------------------------------------
//
// Private data
//
//------------------------------------------------------
object _item;
string _propertyName;
object _value;
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
// Description: Defines a request to the async data system.
//
// Specs: http://avalon/connecteddata/M5%20Specs/Asynchronous%20Data%20Model.mht
//
//---------------------------------------------------------------------------
using System;
namespace MS.Internal.Data
{
/// Type for the work and completion delegates of an AsyncDataRequest
internal delegate object AsyncRequestCallback(AsyncDataRequest request);
/// Status of an async data request.
internal enum AsyncRequestStatus
{
/// Request has not been started
Waiting,
/// Request is in progress
Working,
/// Request has been completed
Completed,
/// Request was cancelled
Cancelled,
/// Request failed
Failed
}
/// A request to the async data system.
internal class AsyncDataRequest
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
/// Constructor
internal AsyncDataRequest( object bindingState,
AsyncRequestCallback workCallback,
AsyncRequestCallback completedCallback,
params object[] args
)
{
_bindingState = bindingState;
_workCallback = workCallback;
_completedCallback = completedCallback;
_args = args;
}
//------------------------------------------------------
//
// Public Properties
//
//-----------------------------------------------------
/* unused by default scheduler. Restore for custom schedulers.
/// The "user data" from the binding that issued the request.
public object BindingState { get { return _bindingState; } }
*/
/// The result of the request (valid when request is completed).
public object Result { get { return _result; } }
/// The status of the request.
public AsyncRequestStatus Status { get { return _status; } }
/// The exception (for a failed request).
public Exception Exception { get { return _exception; } }
//------------------------------------------------------
//
// Public Methods
//
//------------------------------------------------------
/// Run the request's work delegate and return the result.
///
/// This method should be called synchronously on a worker thread, as it
/// calls the work delegate, which potentially takes a long time. The
/// method sets the status to "Working". It is normally followed by a
/// call to Complete.
///
/// If the request has already been run or has been abandoned, this method
/// returns null.
///
public object DoWork()
{
if (DoBeginWork() && _workCallback != null)
return _workCallback(this);
else
return null;
}
/// If the request is in the "Waiting" state, return true and
/// set its status to "Working". Otherwise return false.
///
///
/// This method is thread-safe and works atomically. Therefore only
/// one thread will be permitted to run the request.
///
public bool DoBeginWork()
{
return ChangeStatus(AsyncRequestStatus.Working);
}
/// Set the request's status to "Completed", save the result,
/// and call the completed delegate.
///
/// This method should be called on any thread, after
/// either calling DoWork or performing the work for a request in some
/// other way.
///
/// If the request has already been run or has been abandoned, this method
/// does nothing.
///
public void Complete(object result)
{
if (ChangeStatus(AsyncRequestStatus.Completed))
{
_result = result;
if (_completedCallback != null)
_completedCallback(this);
}
}
/// Cancel the request.
/// This method can be called from any thread.
/// Calling Cancel does not actually terminate the work being
/// done on behalf of the request, but merely causes the result
/// of that work to be ignored.
///
public void Cancel()
{
ChangeStatus(AsyncRequestStatus.Cancelled);
}
/// Fail the request because of an exception.
/// This method can be called from any thread.
public void Fail(Exception exception)
{
if (ChangeStatus(AsyncRequestStatus.Failed))
{
_exception = exception;
if (_completedCallback != null)
_completedCallback(this);
}
}
//-----------------------------------------------------
//
// Internal properties
//
//------------------------------------------------------
/// The caller-defined arguments.
internal object[] Args { get { return _args; } }
//-----------------------------------------------------
//
// Private methods
//
//-----------------------------------------------------
// Change the status to the new status. Return true if this is allowed.
// Do it all atomically.
bool ChangeStatus(AsyncRequestStatus newStatus)
{
bool allowChange = false;
lock(SyncRoot)
{
switch (newStatus)
{
case AsyncRequestStatus.Working:
allowChange = (_status == AsyncRequestStatus.Waiting);
break;
case AsyncRequestStatus.Completed:
allowChange = (_status == AsyncRequestStatus.Working);
break;
case AsyncRequestStatus.Cancelled:
allowChange = (_status == AsyncRequestStatus.Waiting) ||
(_status == AsyncRequestStatus.Working);
break;
case AsyncRequestStatus.Failed:
allowChange = (_status == AsyncRequestStatus.Working);
break;
}
if (allowChange)
_status = newStatus;;
}
return allowChange;
}
//-----------------------------------------------------
//
// Private data
//
//------------------------------------------------------
AsyncRequestStatus _status;
object _result;
object _bindingState;
object[] _args;
Exception _exception;
AsyncRequestCallback _workCallback;
AsyncRequestCallback _completedCallback;
object SyncRoot = new object(); // for synchronization
}
/// Async request to get the value of a property on an item.
internal class AsyncGetValueRequest : AsyncDataRequest
{
//-----------------------------------------------------
//
// Constructors
//
//------------------------------------------------------
/// Constructor.
internal AsyncGetValueRequest( object item,
string propertyName,
object bindingState,
AsyncRequestCallback workCallback,
AsyncRequestCallback completedCallback,
params object[] args
)
: base(bindingState, workCallback, completedCallback, args)
{
_item = item;
_propertyName = propertyName;
}
//------------------------------------------------------
//
// Public Properties
//
//-----------------------------------------------------
/// The item whose property is being requested
public object SourceItem { get { return _item; } }
/* unused by default scheduler. Restore for custom schedulers.
/// The name of the property being requested
public string PropertyName { get { return _propertyName; } }
*/
//------------------------------------------------------
//
// Private data
//
//-----------------------------------------------------
object _item;
string _propertyName;
}
/// Async request to set the value of a property on an item.
internal class AsyncSetValueRequest : AsyncDataRequest
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
/// Constructor.
internal AsyncSetValueRequest( object item,
string propertyName,
object value,
object bindingState,
AsyncRequestCallback workCallback,
AsyncRequestCallback completedCallback,
params object[] args
)
: base(bindingState, workCallback, completedCallback, args)
{
_item = item;
_propertyName = propertyName;
_value = value;
}
//------------------------------------------------------
//
// Public Properties
//
//-----------------------------------------------------
/// The item whose property is being set
public object TargetItem { get { return _item; } }
/* unused by default scheduler. Restore for custom schedulers.
/// The name of the property being set
public string PropertyName { get { return _propertyName; } }
*/
/// The new value for the property
public object Value { get { return _value; } }
//------------------------------------------------------
//
// Private data
//
//------------------------------------------------------
object _item;
string _propertyName;
object _value;
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ListControlConvertEventArgs.cs
- QilCloneVisitor.cs
- CodeTypeParameter.cs
- WorkflowElementDialogWindow.xaml.cs
- AuthenticateEventArgs.cs
- SystemColors.cs
- xsdvalidator.cs
- TextOnlyOutput.cs
- SkewTransform.cs
- ExtensionQuery.cs
- FileDialog_Vista.cs
- RoutedEventHandlerInfo.cs
- DataGridViewCellParsingEventArgs.cs
- FormatException.cs
- PanningMessageFilter.cs
- XmlWellformedWriter.cs
- Form.cs
- LinkConverter.cs
- util.cs
- ProcessThreadCollection.cs
- WebPartDisplayModeEventArgs.cs
- CommonDialog.cs
- CallContext.cs
- ControlBindingsCollection.cs
- ParsedRoute.cs
- ScriptManager.cs
- BasicViewGenerator.cs
- RolePrincipal.cs
- RequestCacheEntry.cs
- XmlStreamNodeWriter.cs
- PtsCache.cs
- WebConfigurationFileMap.cs
- Token.cs
- MetadataHelper.cs
- PageTheme.cs
- TemplateKey.cs
- ProxyWebPart.cs
- StylusDevice.cs
- SqlParameter.cs
- DbParameterHelper.cs
- InvalidComObjectException.cs
- ScrollableControl.cs
- ToolStripItemEventArgs.cs
- ListBase.cs
- Reference.cs
- CalendarDay.cs
- TextTreeInsertUndoUnit.cs
- ButtonBaseAutomationPeer.cs
- MemberRelationshipService.cs
- XmlSchemaCompilationSettings.cs
- SqlUDTStorage.cs
- Point3DAnimationBase.cs
- MethodCallConverter.cs
- TableCellCollection.cs
- Size.cs
- SchemaType.cs
- MobileControl.cs
- NameTable.cs
- IProvider.cs
- XmlUtf8RawTextWriter.cs
- SafeRightsManagementHandle.cs
- LocationUpdates.cs
- ConstNode.cs
- FontStretchConverter.cs
- CipherData.cs
- MarginsConverter.cs
- LayoutEvent.cs
- TCPClient.cs
- EventProviderWriter.cs
- TextEditorContextMenu.cs
- Selector.cs
- Exception.cs
- Subtree.cs
- NameHandler.cs
- ListBoxItemWrapperAutomationPeer.cs
- SHA512.cs
- MenuCommandsChangedEventArgs.cs
- RequestCachePolicy.cs
- RawStylusSystemGestureInputReport.cs
- HttpServerVarsCollection.cs
- SqlBooleanizer.cs
- WSHttpBindingCollectionElement.cs
- GridItemPattern.cs
- CompleteWizardStep.cs
- PageAdapter.cs
- AdapterUtil.cs
- SafeSecurityHandles.cs
- TypeConverterAttribute.cs
- Compilation.cs
- StrongNamePublicKeyBlob.cs
- DefaultMemberAttribute.cs
- MarshalByRefObject.cs
- PipeConnection.cs
- ContentDisposition.cs
- ResourceReferenceKeyNotFoundException.cs
- Geometry.cs
- OuterGlowBitmapEffect.cs
- SafeNativeMethods.cs
- DocumentXmlWriter.cs
- Scalars.cs