47 lines
1.2 KiB
C#
47 lines
1.2 KiB
C#
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;
|
|
});
|
|
}
|
|
} |