private async Task <WriteDataItemsResult> AdapterWriteTask(AdapterState adapter, List <DataItemValue> items, Duration?timeout) { if (adapter.State != State.Running) { string err = "Adapter is not in state Running. Current state: " + adapter.State; Log_Warn("WriteStateError", err); adapter.SetOfPendingWriteItems.ExceptWith(items.Select(it => it.ID)); FailedDataItemWrite[] failures = items.Select(it => new FailedDataItemWrite(it.ID, err)).ToArray(); return(WriteDataItemsResult.Failure(failures)); } try { IList <WriteTask> writeTasks = adapter.WriteItems(items, timeout); Task <WriteDataItemsResult>[] tasks = writeTasks.Select(writeTask => writeTask.Task.ContinueWith(t => { adapter.SetOfPendingWriteItems.ExceptWith(writeTask.IDs); return(t.Result); })).ToArray(); WriteDataItemsResult[] res = await Task.WhenAll(tasks); return(WriteDataItemsResult.FromResults(res)); } catch (Exception exception) { Exception exp = exception.GetBaseException() ?? exception; string err = adapter.Name + " adapter exception: " + exp.Message; Task ignored = RestartAdapterOrCrash(adapter, "Write exception: " + exp.Message); FailedDataItemWrite[] failures = items.Select(it => new FailedDataItemWrite(it.ID, err)).ToArray(); return(WriteDataItemsResult.Failure(failures)); } }
public WriteDataItemsResult GetWriteResult() { if (failures.Count == 0) { return(WriteDataItemsResult.OK); } else { return(WriteDataItemsResult.Failure(failures.ToArray())); } }
private async Task Runner() { while (true) { WorkItem it = await queue.ReceiveAsync(); switch (it.Methode) { case MethodID.Init: { var promise = (TaskCompletionSource <Group[]>)it.Promise; try { var groups = await adapter.Initialize((Adapter)it.Param1, (AdapterCallback)it.Param2, (DataItemInfo[])it.Param3); promise.SetResult(groups); } catch (Exception exp) { promise.SetException(exp); } break; } case MethodID.StartRunning: { try { adapter.StartRunning(); } catch (Exception exp) { Console.Error.WriteLine("Exception in adapter.StartRunning: " + exp.Message); } break; } case MethodID.ReadDataItems: { var promise = (TaskCompletionSource <VTQ[]>)it.Promise; try { var values = await adapter.ReadDataItems((string)it.Param1, (IList <ReadRequest>) it.Param2, (Duration?)it.Param3); promise.SetResult(values); } catch (Exception exp) { promise.SetException(exp); } break; } case MethodID.WriteDataItems: { var promise = (TaskCompletionSource <WriteDataItemsResult>)it.Promise; try { WriteDataItemsResult res = await adapter.WriteDataItems((string)it.Param1, (IList <DataItemValue>) it.Param2, (Duration?)it.Param3); promise.SetResult(res); } catch (Exception exp) { promise.SetException(exp); } break; } case MethodID.BrowseDataItemAddress: { var promise = (TaskCompletionSource <string[]>)it.Promise; try { string[] res = await adapter.BrowseDataItemAddress((string)it.Param1); promise.SetResult(res); } catch (Exception exp) { promise.SetException(exp); } break; } case MethodID.BrowseAdapterAddress: { var promise = (TaskCompletionSource <string[]>)it.Promise; try { string[] res = await adapter.BrowseAdapterAddress(); promise.SetResult(res); } catch (Exception exp) { promise.SetException(exp); } break; } case MethodID.Shutdown: { var promise = (TaskCompletionSource <bool>)it.Promise; try { await adapter.Shutdown(); promise.SetResult(true); } catch (Exception exp) { promise.SetException(exp); } return; // Exit loop } } } // while }