feat: 添加等待并比较读取返回值的扩展方法
This commit is contained in:
46
src/ThingsGateway.Foundation/OperResult/OperResultUtil.cs
Normal file
46
src/ThingsGateway.Foundation/OperResult/OperResultUtil.cs
Normal 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");
|
||||
}
|
||||
}
|
@@ -1,6 +1,6 @@
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<Version>6.0.1.6</Version>
|
||||
<Version>6.0.1.7</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
@@ -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);
|
||||
|
||||
|
Reference in New Issue
Block a user