示例#1
0
        public async Task ExclusiveAccess_Test()
        {
            var exclusiveAccess0 = new ExclusiveAccess <int>();
            var exclusiveAccess1 = new ExclusiveAccess <int>(1);

            Assert.Equal(0, exclusiveAccess0.Value);
            Assert.Equal(1, exclusiveAccess1.Value);

            exclusiveAccess0.Update(u => 2);
            Assert.Equal(2, exclusiveAccess0.Value);

            var t1 = Task.Run(
                () => exclusiveAccess0.Update(
                    v =>
            {
                Thread.Sleep(100);
                return(10);
            }));

            await Task.Delay(10);

            Assert.Equal(10, exclusiveAccess0.Value);

            var t2 = Task.Run(
                () => exclusiveAccess0.Update(
                    v =>
            {
                Thread.Sleep(100);
                return(20);
            }));

            await Task.Delay(20);

            exclusiveAccess0.Use(v => Assert.Equal(20, v));
        }
        private async Task InitializeConnectionWithTiaPortalProject()
        {
            await Task.Run(() =>
            {
                if (!accessAvailable)
                {
                    IList <TiaPortalProcess> processes = TiaPortal.GetProcesses();

                    switch (processes.Count)
                    {
                    case 1:
                        _tiaProcess = processes[0];
                        MyTiaPortal = _tiaProcess.Attach();
                        break;

                    case 0:
                        throw new EngineeringTargetInvocationException(
                            "No running instance of TIA Portal was found!");

                    default:
                        throw new EngineeringTargetInvocationException(
                            "More than one running instance of TIA Portal was found!");
                    }

                    if (MyTiaPortal.Projects.Count <= 0)
                    {
                        throw new EngineeringTargetInvocationException(
                            "No open TIA Portal Project was found!");
                    }

                    MyProject = MyTiaPortal.Projects[0];

                    exclusiveAccess = MyTiaPortal.ExclusiveAccess("My Activity");
                    accessAvailable = true;
                }

                if (!transactionOpen)
                {
                    transaction     = exclusiveAccess.Transaction(MyProject, "No changes commited.");
                    transactionOpen = true;
                }
            }).ConfigureAwait(true);
        }
        protected override void ConnectCore()
        {
            var connFactory = new ConnectionFactory();
            connFactory.HostName = _config.ServiceBusAddress;
            
            //Loop through all the custom fields and set them dynamically
            foreach (var memberInfo in memberInfos)
            {
                if (_config.CustomProps.ContainsKey(memberInfo.Name))
                {
                    object val = _config.CustomProps[memberInfo.Name];
                    try
                    {
                        if (memberInfo.MemberType == MemberTypes.Field)
                        {
                            var f = (FieldInfo) memberInfo;
                            var settingValue = Convert.ChangeType(val, f.FieldType);
                            f.SetValue(connFactory, settingValue);    
                        }
                        else if (memberInfo.MemberType == MemberTypes.Property)
                        {
                            var p = (PropertyInfo)memberInfo;
                            var settingValue = Convert.ChangeType(val, p.PropertyType);
                            p.SetValue(connFactory, settingValue, null);
                        }
                        
                    }
                    catch (Exception e)
                    {
                        //TODO: Do something with the exception...
                    }
                }
            }

            _connection = connFactory.CreateConnection();
            
            //You can create multiple channels or sessions on the same connection... although not sure what that means.
            //Using one session per connection here.
            _session = new ExclusiveAccess<IModel>(_connection.CreateModel());
            _session.Use.ExchangeDeclare(EXCHANGE_NAME, ExchangeType.Topic, true);
        }
 public static int Increment(this ExclusiveAccess <int> exclusiveAccess)
 {
     return(exclusiveAccess.Update(v => ++ v));
 }