Dispenser/DispenserCommon/Scheduler/TaskWaiter.cs

47 lines
1.2 KiB
C#
Raw Permalink Normal View History

2024-08-16 07:20:09 +00:00
using Castle.Core.Internal;
using DispenserCommon.Atrributes;
using Serilog;
namespace DispenserCommon.Scheduler;
public class TaskWaiter
{
/// <summary>
/// 在
/// </summary>
/// <param name="action"></param>
/// <param name="timeout"></param>
/// <param name="cts"></param>
/// <returns></returns>
public static async Task<bool> WaitingFor(Func<bool> action, long timeout = 60000,
CancellationTokenSource? cts = null)
{
var method = action.Method;
var blockTask = method.GetAttribute<BlockTask>();
var taskName = blockTask?.Name ?? method.Name;
var span = TimeSpan.FromMilliseconds(timeout);
var endTime = DateTime.Now.Add(span);
return await Task.Run(() =>
{
while (DateTime.Now < endTime)
{
if (cts is { IsCancellationRequested: true })
{
return false;
}
if (action())
{
Log.Information($"{taskName} 任务等待完成");
return true;
}
Thread.Sleep(200);
}
return false;
});
}
}