![](/img/trans.png)
[英]How to access a public property from another project's c# class from WinJS
[英]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) 的公共屬性:
代碼:
class ClassA
{
private void initClassB(myType myValue)
{
ClassB MyClassB = new ClassB();
MyClassB.MyProperty = myValue;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.