feat: 添加等待并比较读取返回值的扩展方法

This commit is contained in:
Diego
2024-05-30 10:31:03 +08:00
parent 6f43957703
commit 908a2eba20
3 changed files with 56 additions and 1 deletions

View File

@@ -0,0 +1,46 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://kimdiego2098.github.io/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Foundation;
public static class OperResultUtil
{
/// <summary>
/// 等待读取到指定值,超时返回错误
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="func">执行回调</param>
/// <param name="value">比较值</param>
/// <param name="timeout">超时时间</param>
/// <param name="cancellationToken">取消令箭</param>
/// <returns></returns>
public static async ValueTask<OperResult> WaitAsync<T>(Func<CancellationToken, ValueTask<OperResult<T>>> func, T value, int timeout, CancellationToken cancellationToken = default) where T : IEquatable<T>
{
using var timeoutToken = new CancellationTokenSource(TimeSpan.FromMilliseconds(timeout));
using CancellationTokenSource stoppingToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutToken.Token);
while (!stoppingToken.IsCancellationRequested)
{
var result = await func(stoppingToken.Token).ConfigureAwait(false);
if (result.IsSuccess)
{
if (result.Content.Equals(value))
{
return new OperResult();
}
}
else
{
return result;
}
}
return new OperResult("Timeout");
}
}

View File

@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<Version>6.0.1.6</Version>
<Version>6.0.1.7</Version>
</PropertyGroup>
<ItemGroup>

View File

@@ -45,6 +45,15 @@ internal class ModbusMasterTest
Console.WriteLine(data.ToJsonNetString());
//Console.ReadLine();
//等待读取到指定值
var waitResult = await OperResultUtil.WaitAsync<short>(async (a) =>
{
return await modbusMaster.ReadInt16Async("40001;");
}
, 10, 10000
);
Console.WriteLine(waitResult.ToJsonString());
//构造实体类对象,传入协议对象与连读打包的最大数量
ModbusVariable modbusVariable = new(modbusMaster, 100);