コード例 #1
0
        // this is a special method that's not awaited
        public async Task StartWaitingForEvents(RemoteEvent remoteEvent)
        {
            while (true)
            {
                try
                {
                    var operation = await _database.ReadOperationAsync(CancellationToken.None).ConfigureAwait(false);

                    switch (operation)
                    {
                    case IscCodes.op_event:
                        var dbHandle = await _database.Xdr.ReadInt32Async(CancellationToken.None).ConfigureAwait(false);

                        var buffer = await _database.Xdr.ReadBufferAsync(CancellationToken.None).ConfigureAwait(false);

                        var ast = new byte[8];
                        await _database.Xdr.ReadBytesAsync(ast, 8, CancellationToken.None).ConfigureAwait(false);

                        var eventId = await _database.Xdr.ReadInt32Async(CancellationToken.None).ConfigureAwait(false);

                        remoteEvent.EventCounts(buffer);

                        await remoteEvent.Database.QueueEventsAsync(remoteEvent, CancellationToken.None).ConfigureAwait(false);

                        break;

                    default:
                        Debug.Assert(false);
                        break;
                    }
                }
                catch (Exception) when(Volatile.Read(ref _closing))
                {
                    return;
                }
                catch (Exception ex)
                {
                    remoteEvent.EventError(ex);
                    break;
                }
            }
        }
コード例 #2
0
        public async Task WaitForEventsAsync(RemoteEvent remoteEvent)
        {
            while (true)
            {
                try
                {
                    var operation = await _database.ReadOperationAsync().ConfigureAwait(false);

                    switch (operation)
                    {
                    case IscCodes.op_event:
                        var dbHandle = _database.Xdr.ReadInt32();
                        var buffer   = _database.Xdr.ReadBuffer();
                        var ast      = new byte[8];
                        _database.Xdr.ReadBytes(ast, 8);
                        var eventId = _database.Xdr.ReadInt32();

                        remoteEvent.EventCounts(buffer);

                        break;

                    default:
                        Debug.Assert(false);
                        break;
                    }
                }
                catch (Exception) when(_disposing)
                {
                    return;
                }
                catch (Exception ex) when(!_disposing)
                {
                    remoteEvent.EventError(ex);
                    break;
                }
            }
        }
コード例 #3
0
ファイル: GdsArray.cs プロジェクト: dant02/NETProvider
        private async ValueTask <byte[]> ReceiveSliceResponseAsync(ArrayDesc desc, CancellationToken cancellationToken = default)
        {
            try
            {
                var operation = await _database.ReadOperationAsync(cancellationToken).ConfigureAwait(false);

                if (operation == IscCodes.op_slice)
                {
                    var isVariying = false;
                    var elements   = 0;
                    var length     = await _database.Xdr.ReadInt32Async(cancellationToken).ConfigureAwait(false);

                    length = await _database.Xdr.ReadInt32Async(cancellationToken).ConfigureAwait(false);

                    switch (desc.DataType)
                    {
                    case IscCodes.blr_text:
                    case IscCodes.blr_text2:
                    case IscCodes.blr_cstring:
                    case IscCodes.blr_cstring2:
                        elements = length / desc.Length;
                        length  += elements * ((4 - desc.Length) & 3);
                        break;

                    case IscCodes.blr_varying:
                    case IscCodes.blr_varying2:
                        elements   = length / desc.Length;
                        isVariying = true;
                        break;

                    case IscCodes.blr_short:
                        length = length * desc.Length;
                        break;
                    }

                    if (isVariying)
                    {
                        using (var ms = new MemoryStream())
                        {
                            var xdr = new XdrReaderWriter(new DataProviderStreamWrapper(ms));
                            for (var i = 0; i < elements; i++)
                            {
                                var buffer = await _database.Xdr.ReadOpaqueAsync(await _database.Xdr.ReadInt32Async(cancellationToken).ConfigureAwait(false), cancellationToken).ConfigureAwait(false);

                                await xdr.WriteBufferAsync(buffer, buffer.Length, cancellationToken).ConfigureAwait(false);
                            }
                            await xdr.FlushAsync(cancellationToken).ConfigureAwait(false);

                            return(ms.ToArray());
                        }
                    }
                    else
                    {
                        return(await _database.Xdr.ReadOpaqueAsync(length, cancellationToken).ConfigureAwait(false));
                    }
                }
                else
                {
                    await _database.ReadResponseAsync(operation, cancellationToken).ConfigureAwait(false);

                    return(null);
                }
            }
            catch (IOException ex)
            {
                throw IscException.ForIOException(ex);
            }
        }