Specifies the parameters for an async write request.
Inheritance: ComDaAsnycRequest
Esempio n. 1
0
        /// <summary>
        /// Starts an asynchronous write operation.
        /// </summary>
        /// <param name="transactionId">The transaction id.</param>
        /// <param name="serverHandles">The server handles.</param>
        /// <param name="values">The values.</param>
        /// <param name="cancelId">The cancel id.</param>
        /// <returns>Any errors.</returns>
        public int[] AsyncWrite(int transactionId, int[] serverHandles, DaValue[] values, out int cancelId)
        {
            TraceState("AsyncWrite", transactionId, serverHandles.Length);
            ThrowIfDisposed();

            cancelId = 0;

            lock (m_lock)
            {
                int[] results = new int[serverHandles.Length];
                List<ComDaGroupItem> items = new List<ComDaGroupItem>(serverHandles.Length);
                List<DaValue> valuesToWrite = new List<DaValue>(serverHandles.Length);

                for (int ii = 0; ii < serverHandles.Length; ii++)
                {
                    ComDaGroupItem item = null;

                    if (!m_itemsByHandle.TryGetValue(serverHandles[ii], out item))
                    {
                        results[ii] = ResultIds.E_INVALIDHANDLE;
                        continue;
                    }

                    items.Add(item);
                    valuesToWrite.Add(values[ii]);
                }

                if (items.Count > 0)
                {
                    ComDaAsnycWriteRequest request = new ComDaAsnycWriteRequest();

                    request.CancelId = ++m_transactionCounter;
                    request.TransactionId = transactionId;
                    request.ServerHandles = new int[items.Count];
                    request.ClientHandles = new int[items.Count];
                    request.Values = valuesToWrite.ToArray();

                    for (int ii = 0; ii < items.Count; ii++)
                    {
                        request.ServerHandles[ii] = items[ii].ServerHandle;
                        request.ClientHandles[ii] = items[ii].ClientHandle;
                    }

                    m_requests.Add(request);
                    cancelId = request.CancelId;

                    TraceState("AsyncWrite Queued", transactionId, request.CancelId);

                    // create a thread to process the request.
                    Thread thread = new Thread(OnAsyncWrite);
                    thread.IsBackground = true;
                    thread.Start(request);
                }

                return results;
            }
        }