public int[] AsyncRead(uint maxAge, int transactionId, int[] serverHandles, out int cancelId)
{
TraceState("AsyncRead", maxAge, transactionId, serverHandles.Length);
ThrowIfDisposed();
cancelId = 0;
lock (m_lock)
{
int[] results = new int[serverHandles.Length];
List<ComDaGroupItem> items = new List<ComDaGroupItem>(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);
}
if (items.Count > 0)
{
ComDaAsnycReadRequest request = new ComDaAsnycReadRequest();
request.CancelId = ++m_transactionCounter;
request.TransactionId = transactionId;
request.MaxAge = maxAge;
request.ServerHandles = new int[items.Count];
request.ClientHandles = new int[items.Count];
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;
// create a thread to process the request.
Thread thread = new Thread(OnAsyncRead);
thread.IsBackground = true;
thread.Start(request);
}
return results;
}
}