簡體   English   中英

C# 在另一個類中設置公共屬性

[英]C# Setting a public property in another class

我下面有一個類。 StartDispensing 方法將連續循環運行,直到該類的公共屬性發生更改。

我的問題是如何從另一個類設置這些屬性。

下面 class1 的代碼。

 using Abp.Dependency;
using Abp.Reflection.Extensions;
using Erx.Middleware.Configuration;
using Microsoft.Extensions.Configuration;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Erx.Middleware.TCPCommunicator.Executer
{
    public class IndexerDispenserExecuter : ITransientDependency
    {
        private readonly Log _log;
        private readonly IConfigurationRoot _appConfiguration;            
        public bool IsToteWaiting { get; set; } = false;
        public bool IsIndexerFull { get; set; } = true;

        public IndexerDispenserExecuter(Log log)
        {
            _log = log;
            _appConfiguration = AppConfigurations.Get(
              typeof(TcpCommunicatorModule).GetAssembly().GetDirectoryPathOrNull()
          );
        }

        public void Run()
        {
          
            new Thread(() =>
            {
                Thread.CurrentThread.IsBackground = true;
                StartDispensing();
            }).Start();

        }

        private void StartDispensing()
        {
            try
            {
                while (true)
                {
                   if (IsIndexerFull && IsToteWaiting) //NEED TO be able to set these variables from anywhere in the application
                    {
                        _log.Write("Do Something");
                    }
                }
            }
            catch (Exception e)
            {
                _log.Write("Server Error : " + e.ToString());
            }
        }    

    }

}

我想從另一個文件中的另一個類更改公共屬性 IsToteWaiting。 當我將 IsToteWaiting 屬性的值更改為 true 時,我希望點擊 do something 行。

    using Abp.Dependency;
using Abp.Events.Bus;
using Abp.Reflection.Extensions;
using Erx.Middleware.Configuration;
using Erx.Middleware.TCPCommunicator.Domain;
using Erx.Middleware.TCPCommunicator.Executer; // Reference to class
using Erx.Middleware.TCPCommunicator.Messages;
using Erx.Middleware.TCPCommunicator.Models;
using Microsoft.Extensions.Configuration;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Erx.Middleware.TCPCommunicator.Handlers
{
    public class MessageHandler : ITransientDependency
    {
        private readonly Log _log;
        private readonly IConfigurationRoot _appConfiguration;
        TcpPLCClientExecuter _tcpPLCClientExecuter;
        IndexerDispenserExecuter _indexerDispenserExecuter; //Instantiate Class
        PLCMessages _PlcMessages;
        WorkItemManager _workItemManager;
        public IEventBus EventBus { get; set; }


        public MessageHandler(
            Log log, TcpPLCClientExecuter tcpPLCClientExecuter, PLCMessages PlcMessages, WorkItemManager workItemManager, IndexerDispenserExecuter indexerDispenserExecuter)
        {
            _log = log;
            _tcpPLCClientExecuter = tcpPLCClientExecuter;
            _PlcMessages = PlcMessages;
            _workItemManager = workItemManager;
            _indexerDispenserExecuter = indexerDispenserExecuter; //Assign Class
            EventBus = NullEventBus.Instance;
            _appConfiguration = AppConfigurations.Get(
              typeof(TcpCommunicatorModule).GetAssembly().GetDirectoryPathOrNull()
          );
        }
        public string ValidateMessage(string message)
        {
            var result = "OK";
            return result;
        }


        public async Task HandleMessages(string message)
        {           
           _indexerDispenserExecuter.IsToteWaiting = true;
        }

    }


}

更新的工作解決方案

using Abp.Dependency;
using Abp.Domain.Uow;
using Abp.Reflection.Extensions;
using Abp.Threading.BackgroundWorkers;
using Abp.Threading.Timers;
using Erx.Middleware.Configuration;
using Erx.Middleware.TCPCommunicator;
using Microsoft.Extensions.Configuration;

public class DispenseIndexHandler : PeriodicBackgroundWorkerBase, ISingletonDependency
{
    private readonly Log _log;
    private readonly IConfigurationRoot _appConfiguration;
    public bool IsToteWaiting { get; set; } = false;

    public DispenseIndexHandler(AbpTimer timer, Log log)
        : base(timer)
    {
        _log = log;
        Timer.Period = 5000; //5 seconds (good for tests, but normally will be more)
        _appConfiguration = AppConfigurations.Get(
             typeof(TcpCommunicatorModule).GetAssembly().GetDirectoryPathOrNull()
         );
    }

    [UnitOfWork]
    protected override void DoWork()
    {
        if (IsToteWaiting)
        { 
            _log.Write("ToteWaiting for dispense"); 
        }

    }

    private void Dispense()
    {

    }

    private void MoveForWard()
    {

    }
}

我認為您的問題是從“另一個線程”而不是“另一個類”更改屬性。 因為另一個類只是工作,因為該類和屬性是公共設置器。

您需要使屬性具有帶有volatile 關鍵字的支持字段。 例子:

private volatile bool _isToteWaiting = false;
public bool IsToteWaiting
{
    get
    { 
        return _isToteWaiting;
    }
    set
    {
        _isToteWaiting = value;
    }
}

因為它看起來沒有 volatile,您的代碼可以優化為讀取一次屬性而不是

從另一個類 (B) 設置類 (A) 的公共屬性:

  1. 在類 (A) 的方法中實例化類 (B) 的新實例。 或者從別的地方拿...
  2. 設置屬性

代碼:

class ClassA
{
    private void initClassB(myType myValue)
    { 
        ClassB MyClassB = new ClassB();
        MyClassB.MyProperty = myValue;
    }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM