You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
2.9 KiB
C#

using HslCommunication.Core;
using HslCommunication.LogNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HslCommunication.Enthernet
{
/// <summary>
/// 文件标记对象类
/// </summary>
internal class FileMarkId
{
/// <summary>
/// 实例化一个文件标记对象
/// </summary>
/// <param name="logNet">日志对象</param>
/// <param name="fileName">完整的文件名称</param>
public FileMarkId( ILogNet logNet, string fileName )
{
LogNet = logNet;
FileName = fileName;
}
private ILogNet LogNet; // 日志
private string FileName = null; // 文件名称
private Queue<Action> queues = new Queue<Action>( ); // 操作的队列
private SimpleHybirdLock hybirdLock = new SimpleHybirdLock( ); // 状态的锁
/// <summary>
/// 新增一个文件的操作,仅仅是删除文件
/// </summary>
/// <param name="action">对当前文件的操作内容</param>
public void AddOperation( Action action )
{
hybirdLock.Enter( );
if (readStatus == 0)
{
// 没有读取状态,立马执行
action?.Invoke( );
}
else
{
// 添加标记
queues.Enqueue( action );
}
hybirdLock.Leave( );
}
private int readStatus = 0;
/// <summary>
/// 指示该对象是否能被清除
/// </summary>
/// <returns>是否能够删除</returns>
public bool CanClear( )
{
bool result = false;
hybirdLock.Enter( );
result = readStatus == 0 && queues.Count == 0;
hybirdLock.Leave( );
return result;
}
/// <summary>
/// 进入文件的读取状态
/// </summary>
public void EnterReadOperator( )
{
hybirdLock.Enter( );
readStatus++;
hybirdLock.Leave( );
}
/// <summary>
/// 离开本次的文件读取状态
/// </summary>
public void LeaveReadOperator( )
{
// 检查文件标记状态
hybirdLock.Enter( );
readStatus--;
if (readStatus == 0)
{
while (queues.Count > 0)
{
try
{
queues.Dequeue( )?.Invoke( );
}
catch (Exception ex)
{
LogNet?.WriteException( "FileMarkId", "File Action Failed:", ex );
}
}
}
hybirdLock.Leave( );
}
}
}