コード例 #1
0
        private void AsyncGatherItems(object workItem)
        {
            object[] parameters = ( object[] )workItem;

            AsyncQueryInfo queryInfo = parameters[0] as AsyncQueryInfo;

            if (queryInfo.ShouldAbort)
            {
                return;
            }

            IQueryable queryable = ( IQueryable )parameters[1];

            object[] items = new object[queryInfo.RequestedItemCount];

            System.Collections.IEnumerator enumerator;

            lock ( m_syncRoot )
            {
                // We reverify here since a reset could have been issued while we were waiting on the lock statement.
                if ((queryInfo.ShouldAbort) || (!this.IsConnected) || (this.IsDisposed))
                {
                    return;
                }

                try
                {
                    Debug.WriteLineIf(VirtualPageManager.DebugDataVirtualization, "Beginning Provider Execute for page at start index: " + queryInfo.StartIndex.ToString());

                    enumerator = queryable.GetEnumerator();

                    Debug.WriteLineIf(VirtualPageManager.DebugDataVirtualization, "Ended Provider Execute for page at start index: " + queryInfo.StartIndex.ToString());

                    int i = 0;

                    while (enumerator.MoveNext())
                    {
                        object current = enumerator.Current;

                        if (current != null)
                        {
                            items[i] = enumerator.Current;
                        }

                        i++;
                    }
                }
                catch (Exception exception)
                {
                    // TimeOut exeception or other.
                    queryInfo.AbortQuery();
                    queryInfo.Error = exception.Message;
                    return;
                }
            }

            bool queryableWasReversed = ( bool )parameters[2];

            if (queryableWasReversed)
            {
                Array.Reverse(items);
            }

            queryInfo.EndQuery(items);
        }
コード例 #2
0
        private void AsyncGatherItems(object workItem)
        {
            object[] parameters = ( object[] )workItem;

            AsyncQueryInfo queryInfo = parameters[0] as AsyncQueryInfo;

            if (queryInfo.ShouldAbort)
            {
                return;
            }

            IQueryable queryable          = ( IQueryable )parameters[1];
            int        requestedItemCount = queryInfo.RequestedItemCount;

            object[] items = new object[requestedItemCount];

            System.Collections.IEnumerator enumerator;

            lock ( m_syncRoot )
            {
                // We reverify here since a reset could have been issued while we were waiting on the lock statement.
                if ((queryInfo.ShouldAbort) || (!this.IsConnected) || (this.IsDisposed))
                {
                    return;
                }

                try
                {
                    Debug.WriteLineIf(VirtualPageManager.DebugDataVirtualization, "Beginning Provider Execute for page at start index: " + queryInfo.StartIndex.ToString());

                    enumerator = queryable.GetEnumerator();

                    Debug.WriteLineIf(VirtualPageManager.DebugDataVirtualization, "Ended Provider Execute for page at start index: " + queryInfo.StartIndex.ToString());

                    int i = 0;

                    while (enumerator.MoveNext() && (i < requestedItemCount))
                    {
                        object current = enumerator.Current;

                        if (current != null)
                        {
                            items[i] = enumerator.Current;
                            i++;
                        }
                    }
                }
                catch (Exception exception)
                {
                    // TimeOut exeception or other.
                    queryInfo.AbortQuery();
                    queryInfo.Error = exception.Message;
                    return;
                }
            }

            items = items.Where(item => item != null).ToArray();

            try
            {
                if (items.Count() != requestedItemCount)
                {
                    throw new InvalidOperationException("The number of non-null items returned by the source must be equal to the provided item count.");
                }
            }
            catch
            {
                //go silently here, in case the next sequance give a valid result.  At the same time, if it does not, the dev has information when debugging.
            }

            bool queryableWasReversed = ( bool )parameters[2];

            if (queryableWasReversed)
            {
                Array.Reverse(items);
            }

            queryInfo.EndQuery(items);
        }