Exemple #1
0
        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));
            }
        }
Exemple #2
0
 public WriteDataItemsResult GetWriteResult()
 {
     if (failures.Count == 0)
     {
         return(WriteDataItemsResult.OK);
     }
     else
     {
         return(WriteDataItemsResult.Failure(failures.ToArray()));
     }
 }
Exemple #3
0
        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
        }