Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / wpf / src / Framework / MS / Internal / Data / AsyncDataRequest.cs / 1 / 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. /// public void Cancel() { ChangeStatus(AsyncRequestStatus.Cancelled); } ///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.
///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. /// public void Cancel() { ChangeStatus(AsyncRequestStatus.Cancelled); } ///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.
///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
- ACE.cs
- XmlDocumentFragment.cs
- DBBindings.cs
- SharedUtils.cs
- StatusCommandUI.cs
- ListViewTableCell.cs
- Process.cs
- SapiAttributeParser.cs
- sqlpipe.cs
- TableParaClient.cs
- PopupRoot.cs
- XmlIncludeAttribute.cs
- Process.cs
- keycontainerpermission.cs
- UnitySerializationHolder.cs
- ConnectionManagementSection.cs
- CapabilitiesSection.cs
- ActiveXHelper.cs
- RunInstallerAttribute.cs
- LinqDataSourceContextEventArgs.cs
- Vector3DIndependentAnimationStorage.cs
- QuaternionRotation3D.cs
- DesignerSerializationOptionsAttribute.cs
- UInt16.cs
- parserscommon.cs
- TdsParameterSetter.cs
- SqlConnectionPoolGroupProviderInfo.cs
- FormParameter.cs
- TextServicesDisplayAttribute.cs
- InputReferenceExpression.cs
- TraceContext.cs
- LoadedEvent.cs
- DBPropSet.cs
- PublisherIdentityPermission.cs
- FileInfo.cs
- CacheForPrimitiveTypes.cs
- ServiceModelDictionary.cs
- DuplexChannelFactory.cs
- CounterCreationData.cs
- ScriptManagerProxy.cs
- Polyline.cs
- FormViewUpdateEventArgs.cs
- TableLayoutSettings.cs
- UdpDiscoveryMessageFilter.cs
- CodePageEncoding.cs
- XPathNodeIterator.cs
- DesignerActionPanel.cs
- ControlBindingsConverter.cs
- XmlKeywords.cs
- DataObjectCopyingEventArgs.cs
- RouteCollection.cs
- SwitchElementsCollection.cs
- TraceListener.cs
- Stack.cs
- XmlSerializerNamespaces.cs
- ResourceContainer.cs
- WebServiceParameterData.cs
- DataGridColumnHeaderAutomationPeer.cs
- SoapAttributeAttribute.cs
- TimeSpanSecondsConverter.cs
- KeyNotFoundException.cs
- ListItemConverter.cs
- OutputCacheProfileCollection.cs
- XmlNodeChangedEventArgs.cs
- Sorting.cs
- NameValuePermission.cs
- StateMachineHelpers.cs
- XmlName.cs
- VisualProxy.cs
- ApplicationSecurityInfo.cs
- WindowsListViewGroupSubsetLink.cs
- TraceRecords.cs
- CompareValidator.cs
- AppSettingsExpressionBuilder.cs
- DataGridPreparingCellForEditEventArgs.cs
- TableParagraph.cs
- EntitySetBase.cs
- XmlParserContext.cs
- xml.cs
- log.cs
- PropertyMappingExceptionEventArgs.cs
- Animatable.cs
- propertyentry.cs
- Exception.cs
- CodeConditionStatement.cs
- SafeCryptContextHandle.cs
- SetUserLanguageRequest.cs
- AuthenticationService.cs
- SimpleBitVector32.cs
- GradientStop.cs
- DataGridTextBoxColumn.cs
- Enum.cs
- ResourceDefaultValueAttribute.cs
- _DomainName.cs
- SqlDataAdapter.cs
- StringHandle.cs
- SamlNameIdentifierClaimResource.cs
- ChangePassword.cs
- XmlUnspecifiedAttribute.cs
- ArgumentOutOfRangeException.cs