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())); } }