diff --git a/framework/Directory.Build.props b/framework/Directory.Build.props index db52be37448..1ca678ae476 100644 --- a/framework/Directory.Build.props +++ b/framework/Directory.Build.props @@ -1,7 +1,7 @@ net5.0;net6.0;net7.0;net8.0;net9.0 - 4.9.1.37 + 4.9.2 enable 百小僧 百签科技(广东)有限公司 diff --git a/framework/Furion.Pure/App/Extensions/ObjectExtensions.cs b/framework/Furion.Pure/App/Extensions/ObjectExtensions.cs index 849ffc119aa..10b634ce0fd 100644 --- a/framework/Furion.Pure/App/Extensions/ObjectExtensions.cs +++ b/framework/Furion.Pure/App/Extensions/ObjectExtensions.cs @@ -130,12 +130,21 @@ public static void CopyToSave(this byte[] bytes, string path) /// 将流保存到本地磁盘 /// /// - /// + /// 需包含文件名完整路径 /// public static async Task CopyToSaveAsync(this Stream stream, string path) { // 空检查 - if (string.IsNullOrWhiteSpace(path)) throw new ArgumentNullException(nameof(path)); + if (string.IsNullOrWhiteSpace(path)) + { + throw new ArgumentNullException(nameof(path)); + } + + // 文件名判断 + if (string.IsNullOrWhiteSpace(Path.GetFileName(path))) + { + throw new ArgumentException("The parameter of parameter must include the complete file name."); + } using var fileStream = File.Create(path); await stream.CopyToAsync(fileStream); diff --git a/framework/Furion.Pure/TaskQueue/Dependencies/ITaskQueue.cs b/framework/Furion.Pure/TaskQueue/Dependencies/ITaskQueue.cs index 881b32727f8..31b3f2312ba 100644 --- a/framework/Furion.Pure/TaskQueue/Dependencies/ITaskQueue.cs +++ b/framework/Furion.Pure/TaskQueue/Dependencies/ITaskQueue.cs @@ -22,8 +22,10 @@ public interface ITaskQueue /// 任务处理委托 /// 延迟时间(毫秒) /// 任务通道 - /// - Guid Enqueue(Action taskHandler, int delay = 0, string channel = null); + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale + /// + object Enqueue(Action taskHandler, int delay = 0, string channel = null, object taskId = null, object concurrent = null); /// /// 任务项入队 @@ -31,18 +33,22 @@ public interface ITaskQueue /// 任务处理委托 /// 延迟时间(毫秒) /// 任务通道 + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale /// - ValueTask EnqueueAsync(Func taskHandler, int delay = 0, string channel = null); + ValueTask EnqueueAsync(Func taskHandler, int delay = 0, string channel = null, object taskId = null, object concurrent = null); /// /// 任务项入队 /// /// 任务处理委托 /// Cron 表达式 - /// /// 任务通道 - /// - Guid Enqueue(Action taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null); + /// + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale + /// + object Enqueue(Action taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null, object taskId = null, object concurrent = null); /// /// 任务项入队 @@ -51,8 +57,10 @@ public interface ITaskQueue /// Cron 表达式 /// /// 任务通道 + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale /// - ValueTask EnqueueAsync(Func taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null); + ValueTask EnqueueAsync(Func taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null, object taskId = null, object concurrent = null); /// /// 任务项出队 diff --git a/framework/Furion.Pure/TaskQueue/Dependencies/TaskQueue.cs b/framework/Furion.Pure/TaskQueue/Dependencies/TaskQueue.cs index 32ff5a8ca7a..e7da307c5fd 100644 --- a/framework/Furion.Pure/TaskQueue/Dependencies/TaskQueue.cs +++ b/framework/Furion.Pure/TaskQueue/Dependencies/TaskQueue.cs @@ -44,8 +44,10 @@ public TaskQueue(int capacity) /// 任务处理委托 /// 延迟时间(毫秒) /// 任务通道 - /// - public Guid Enqueue(Action taskHandler, int delay = 0, string channel = null) + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale + /// + public object Enqueue(Action taskHandler, int delay = 0, string channel = null, object taskId = null, object concurrent = null) { // 空检查 if (taskHandler == default) @@ -57,7 +59,7 @@ public Guid Enqueue(Action taskHandler, int delay = 0, string { taskHandler(serviceProvider); return ValueTask.CompletedTask; - }, delay, channel) + }, delay, channel, taskId, concurrent) .AsTask().GetAwaiter().GetResult(); } @@ -67,8 +69,10 @@ public Guid Enqueue(Action taskHandler, int delay = 0, string /// 任务处理委托 /// 延迟时间(毫秒) /// 任务通道 + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale /// - public async ValueTask EnqueueAsync(Func taskHandler, int delay = 0, string channel = null) + public async ValueTask EnqueueAsync(Func taskHandler, int delay = 0, string channel = null, object taskId = null, object concurrent = null) { // 空检查 if (taskHandler == default) @@ -76,13 +80,19 @@ public async ValueTask EnqueueAsync(Func { @@ -92,10 +102,11 @@ await _queue.Writer.WriteAsync(new TaskWrapper } await taskHandler(serviceProvider, cancellationToken); - } + }, + Concurrent = concurrent }); - return taskId; + return newTaskId; } /// @@ -105,13 +116,15 @@ await _queue.Writer.WriteAsync(new TaskWrapper /// Cron 表达式 /// 任务通道 /// - /// - public Guid Enqueue(Action taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null) + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale + /// + public object Enqueue(Action taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null, object taskId = null, object concurrent = null) { var totalMilliseconds = Crontab.Parse(cronExpression, format) .GetSleepMilliseconds(DateTime.Now); - return Enqueue(taskHandler, (int)totalMilliseconds, channel); + return Enqueue(taskHandler, (int)totalMilliseconds, channel, taskId, concurrent); } /// @@ -121,13 +134,15 @@ public Guid Enqueue(Action taskHandler, string cronExpression, /// Cron 表达式 /// /// 任务通道 + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale /// - public ValueTask EnqueueAsync(Func taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null) + public ValueTask EnqueueAsync(Func taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null, object taskId = null, object concurrent = null) { var totalMilliseconds = Crontab.Parse(cronExpression, format) .GetSleepMilliseconds(DateTime.Now); - return EnqueueAsync(taskHandler, (int)totalMilliseconds, channel); + return EnqueueAsync(taskHandler, (int)totalMilliseconds, channel, taskId, concurrent); } /// diff --git a/framework/Furion.Pure/TaskQueue/Events/TaskHandlerEventArgs.cs b/framework/Furion.Pure/TaskQueue/Events/TaskHandlerEventArgs.cs index 098c80637ae..9e4e3ee9e1a 100644 --- a/framework/Furion.Pure/TaskQueue/Events/TaskHandlerEventArgs.cs +++ b/framework/Furion.Pure/TaskQueue/Events/TaskHandlerEventArgs.cs @@ -16,7 +16,7 @@ public sealed class TaskHandlerEventArgs : EventArgs /// 任务 Id /// 任务通道 /// 任务处理委托调用结果 - public TaskHandlerEventArgs(Guid taskId, string channel, bool success) + public TaskHandlerEventArgs(object taskId, string channel, bool success) { TaskId = taskId; Channel = channel; @@ -26,7 +26,7 @@ public TaskHandlerEventArgs(Guid taskId, string channel, bool success) /// /// 任务 Id /// - public Guid TaskId { get; } + public object TaskId { get; } /// /// 任务通道 diff --git a/framework/Furion.Pure/TaskQueue/Extensions/TaskQueueServiceCollectionExtensions.cs b/framework/Furion.Pure/TaskQueue/Extensions/TaskQueueServiceCollectionExtensions.cs index 3aa4087c643..c82be40fecd 100644 --- a/framework/Furion.Pure/TaskQueue/Extensions/TaskQueueServiceCollectionExtensions.cs +++ b/framework/Furion.Pure/TaskQueue/Extensions/TaskQueueServiceCollectionExtensions.cs @@ -3,6 +3,7 @@ // 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证。 using Furion.TaskQueue; +using Microsoft.Extensions.DependencyInjection.Extensions; namespace Microsoft.Extensions.DependencyInjection; @@ -75,7 +76,7 @@ private static IServiceCollection AddInternalService(this IServiceCollection ser taskQueueOptionsBuilder.Build(); // 注册后台任务队列接口/实例为单例,采用工厂方式创建 - services.AddSingleton(_ => + services.TryAddSingleton(_ => { // 创建后台队列实例 return new TaskQueue(taskQueueOptionsBuilder.ChannelCapacity); diff --git a/framework/Furion.Pure/TaskQueue/HostedServices/TaskQueuedHostedService.cs b/framework/Furion.Pure/TaskQueue/HostedServices/TaskQueuedHostedService.cs index 32fd19e5e7b..25205cd89ad 100644 --- a/framework/Furion.Pure/TaskQueue/HostedServices/TaskQueuedHostedService.cs +++ b/framework/Furion.Pure/TaskQueue/HostedServices/TaskQueuedHostedService.cs @@ -107,8 +107,13 @@ private async Task BackgroundProcessing(CancellationToken stoppingToken) // 出队 var taskWrapper = await _taskQueue.DequeueAsync(stoppingToken); + // 获取任务执行策略 + var concurrent = taskWrapper.Concurrent == null + ? _concurrent + : (bool)taskWrapper.Concurrent; + // 并行执行 - if (_concurrent) + if (concurrent) { Parallel.For(0, 1, async _ => { diff --git a/framework/Furion.Pure/TaskQueue/Internal/TaskWrapper.cs b/framework/Furion.Pure/TaskQueue/Internal/TaskWrapper.cs index 5305bca58a9..b269096caaa 100644 --- a/framework/Furion.Pure/TaskQueue/Internal/TaskWrapper.cs +++ b/framework/Furion.Pure/TaskQueue/Internal/TaskWrapper.cs @@ -18,10 +18,15 @@ public sealed class TaskWrapper /// /// 任务 ID /// - public Guid TaskId { get; internal set; } + public object TaskId { get; internal set; } /// /// 任务处理委托 /// public Func Handler { get; internal set; } + + /// + /// 是否采用并行执行 + /// + public object Concurrent { get; internal set; } = null; } \ No newline at end of file diff --git a/framework/Furion.Pure/TaskQueue/TaskQueued.cs b/framework/Furion.Pure/TaskQueue/TaskQueued.cs index 06c7a992d0d..f08f25b8c50 100644 --- a/framework/Furion.Pure/TaskQueue/TaskQueued.cs +++ b/framework/Furion.Pure/TaskQueue/TaskQueued.cs @@ -18,11 +18,13 @@ public static class TaskQueued /// 任务处理委托 /// 延迟时间(毫秒) /// 任务通道 - /// - public static Guid Enqueue(Action taskHandler, int delay = 0, string channel = null) + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale + /// + public static object Enqueue(Action taskHandler, int delay = 0, string channel = null, object taskId = null, object concurrent = null) { var taskQueue = App.GetRequiredService(App.RootServices); - return taskQueue.Enqueue(taskHandler, delay, channel); + return taskQueue.Enqueue(taskHandler, delay, channel, taskId, concurrent); } /// @@ -31,11 +33,13 @@ public static Guid Enqueue(Action taskHandler, int delay = 0, /// 任务处理委托 /// 延迟时间(毫秒) /// 任务通道 + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale /// - public static async ValueTask EnqueueAsync(Func taskHandler, int delay = 0, string channel = null) + public static async ValueTask EnqueueAsync(Func taskHandler, int delay = 0, string channel = null, object taskId = null, object concurrent = null) { var taskQueue = App.GetRequiredService(App.RootServices); - return await taskQueue.EnqueueAsync(taskHandler, delay, channel); + return await taskQueue.EnqueueAsync(taskHandler, delay, channel, taskId, concurrent); } /// @@ -43,13 +47,15 @@ public static async ValueTask EnqueueAsync(Func /// 任务处理委托 /// Cron 表达式 - /// 任务通道 /// - /// - public static Guid Enqueue(Action taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null) + /// 任务通道 + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale + /// + public static object Enqueue(Action taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null, object taskId = null, object concurrent = null) { var taskQueue = App.GetRequiredService(App.RootServices); - return taskQueue.Enqueue(taskHandler, cronExpression, format, channel); + return taskQueue.Enqueue(taskHandler, cronExpression, format, channel, taskId, concurrent); } /// @@ -59,10 +65,12 @@ public static Guid Enqueue(Action taskHandler, string cronExpr /// Cron 表达式 /// /// 任务通道 + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale /// - public static async ValueTask EnqueueAsync(Func taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null) + public static async ValueTask EnqueueAsync(Func taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null, object taskId = null, object concurrent = null) { var taskQueue = App.GetRequiredService(App.RootServices); - return await taskQueue.EnqueueAsync(taskHandler, cronExpression, format, channel); + return await taskQueue.EnqueueAsync(taskHandler, cronExpression, format, channel, taskId, concurrent); } } \ No newline at end of file diff --git a/framework/Furion/App/Extensions/ObjectExtensions.cs b/framework/Furion/App/Extensions/ObjectExtensions.cs index 849ffc119aa..10b634ce0fd 100644 --- a/framework/Furion/App/Extensions/ObjectExtensions.cs +++ b/framework/Furion/App/Extensions/ObjectExtensions.cs @@ -130,12 +130,21 @@ public static void CopyToSave(this byte[] bytes, string path) /// 将流保存到本地磁盘 /// /// - /// + /// 需包含文件名完整路径 /// public static async Task CopyToSaveAsync(this Stream stream, string path) { // 空检查 - if (string.IsNullOrWhiteSpace(path)) throw new ArgumentNullException(nameof(path)); + if (string.IsNullOrWhiteSpace(path)) + { + throw new ArgumentNullException(nameof(path)); + } + + // 文件名判断 + if (string.IsNullOrWhiteSpace(Path.GetFileName(path))) + { + throw new ArgumentException("The parameter of parameter must include the complete file name."); + } using var fileStream = File.Create(path); await stream.CopyToAsync(fileStream); diff --git a/framework/Furion/TaskQueue/Dependencies/ITaskQueue.cs b/framework/Furion/TaskQueue/Dependencies/ITaskQueue.cs index 881b32727f8..31b3f2312ba 100644 --- a/framework/Furion/TaskQueue/Dependencies/ITaskQueue.cs +++ b/framework/Furion/TaskQueue/Dependencies/ITaskQueue.cs @@ -22,8 +22,10 @@ public interface ITaskQueue /// 任务处理委托 /// 延迟时间(毫秒) /// 任务通道 - /// - Guid Enqueue(Action taskHandler, int delay = 0, string channel = null); + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale + /// + object Enqueue(Action taskHandler, int delay = 0, string channel = null, object taskId = null, object concurrent = null); /// /// 任务项入队 @@ -31,18 +33,22 @@ public interface ITaskQueue /// 任务处理委托 /// 延迟时间(毫秒) /// 任务通道 + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale /// - ValueTask EnqueueAsync(Func taskHandler, int delay = 0, string channel = null); + ValueTask EnqueueAsync(Func taskHandler, int delay = 0, string channel = null, object taskId = null, object concurrent = null); /// /// 任务项入队 /// /// 任务处理委托 /// Cron 表达式 - /// /// 任务通道 - /// - Guid Enqueue(Action taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null); + /// + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale + /// + object Enqueue(Action taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null, object taskId = null, object concurrent = null); /// /// 任务项入队 @@ -51,8 +57,10 @@ public interface ITaskQueue /// Cron 表达式 /// /// 任务通道 + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale /// - ValueTask EnqueueAsync(Func taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null); + ValueTask EnqueueAsync(Func taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null, object taskId = null, object concurrent = null); /// /// 任务项出队 diff --git a/framework/Furion/TaskQueue/Dependencies/TaskQueue.cs b/framework/Furion/TaskQueue/Dependencies/TaskQueue.cs index 32ff5a8ca7a..e7da307c5fd 100644 --- a/framework/Furion/TaskQueue/Dependencies/TaskQueue.cs +++ b/framework/Furion/TaskQueue/Dependencies/TaskQueue.cs @@ -44,8 +44,10 @@ public TaskQueue(int capacity) /// 任务处理委托 /// 延迟时间(毫秒) /// 任务通道 - /// - public Guid Enqueue(Action taskHandler, int delay = 0, string channel = null) + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale + /// + public object Enqueue(Action taskHandler, int delay = 0, string channel = null, object taskId = null, object concurrent = null) { // 空检查 if (taskHandler == default) @@ -57,7 +59,7 @@ public Guid Enqueue(Action taskHandler, int delay = 0, string { taskHandler(serviceProvider); return ValueTask.CompletedTask; - }, delay, channel) + }, delay, channel, taskId, concurrent) .AsTask().GetAwaiter().GetResult(); } @@ -67,8 +69,10 @@ public Guid Enqueue(Action taskHandler, int delay = 0, string /// 任务处理委托 /// 延迟时间(毫秒) /// 任务通道 + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale /// - public async ValueTask EnqueueAsync(Func taskHandler, int delay = 0, string channel = null) + public async ValueTask EnqueueAsync(Func taskHandler, int delay = 0, string channel = null, object taskId = null, object concurrent = null) { // 空检查 if (taskHandler == default) @@ -76,13 +80,19 @@ public async ValueTask EnqueueAsync(Func { @@ -92,10 +102,11 @@ await _queue.Writer.WriteAsync(new TaskWrapper } await taskHandler(serviceProvider, cancellationToken); - } + }, + Concurrent = concurrent }); - return taskId; + return newTaskId; } /// @@ -105,13 +116,15 @@ await _queue.Writer.WriteAsync(new TaskWrapper /// Cron 表达式 /// 任务通道 /// - /// - public Guid Enqueue(Action taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null) + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale + /// + public object Enqueue(Action taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null, object taskId = null, object concurrent = null) { var totalMilliseconds = Crontab.Parse(cronExpression, format) .GetSleepMilliseconds(DateTime.Now); - return Enqueue(taskHandler, (int)totalMilliseconds, channel); + return Enqueue(taskHandler, (int)totalMilliseconds, channel, taskId, concurrent); } /// @@ -121,13 +134,15 @@ public Guid Enqueue(Action taskHandler, string cronExpression, /// Cron 表达式 /// /// 任务通道 + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale /// - public ValueTask EnqueueAsync(Func taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null) + public ValueTask EnqueueAsync(Func taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null, object taskId = null, object concurrent = null) { var totalMilliseconds = Crontab.Parse(cronExpression, format) .GetSleepMilliseconds(DateTime.Now); - return EnqueueAsync(taskHandler, (int)totalMilliseconds, channel); + return EnqueueAsync(taskHandler, (int)totalMilliseconds, channel, taskId, concurrent); } /// diff --git a/framework/Furion/TaskQueue/Events/TaskHandlerEventArgs.cs b/framework/Furion/TaskQueue/Events/TaskHandlerEventArgs.cs index 098c80637ae..9e4e3ee9e1a 100644 --- a/framework/Furion/TaskQueue/Events/TaskHandlerEventArgs.cs +++ b/framework/Furion/TaskQueue/Events/TaskHandlerEventArgs.cs @@ -16,7 +16,7 @@ public sealed class TaskHandlerEventArgs : EventArgs /// 任务 Id /// 任务通道 /// 任务处理委托调用结果 - public TaskHandlerEventArgs(Guid taskId, string channel, bool success) + public TaskHandlerEventArgs(object taskId, string channel, bool success) { TaskId = taskId; Channel = channel; @@ -26,7 +26,7 @@ public TaskHandlerEventArgs(Guid taskId, string channel, bool success) /// /// 任务 Id /// - public Guid TaskId { get; } + public object TaskId { get; } /// /// 任务通道 diff --git a/framework/Furion/TaskQueue/Extensions/TaskQueueServiceCollectionExtensions.cs b/framework/Furion/TaskQueue/Extensions/TaskQueueServiceCollectionExtensions.cs index 3aa4087c643..c82be40fecd 100644 --- a/framework/Furion/TaskQueue/Extensions/TaskQueueServiceCollectionExtensions.cs +++ b/framework/Furion/TaskQueue/Extensions/TaskQueueServiceCollectionExtensions.cs @@ -3,6 +3,7 @@ // 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证。 using Furion.TaskQueue; +using Microsoft.Extensions.DependencyInjection.Extensions; namespace Microsoft.Extensions.DependencyInjection; @@ -75,7 +76,7 @@ private static IServiceCollection AddInternalService(this IServiceCollection ser taskQueueOptionsBuilder.Build(); // 注册后台任务队列接口/实例为单例,采用工厂方式创建 - services.AddSingleton(_ => + services.TryAddSingleton(_ => { // 创建后台队列实例 return new TaskQueue(taskQueueOptionsBuilder.ChannelCapacity); diff --git a/framework/Furion/TaskQueue/HostedServices/TaskQueuedHostedService.cs b/framework/Furion/TaskQueue/HostedServices/TaskQueuedHostedService.cs index 32fd19e5e7b..25205cd89ad 100644 --- a/framework/Furion/TaskQueue/HostedServices/TaskQueuedHostedService.cs +++ b/framework/Furion/TaskQueue/HostedServices/TaskQueuedHostedService.cs @@ -107,8 +107,13 @@ private async Task BackgroundProcessing(CancellationToken stoppingToken) // 出队 var taskWrapper = await _taskQueue.DequeueAsync(stoppingToken); + // 获取任务执行策略 + var concurrent = taskWrapper.Concurrent == null + ? _concurrent + : (bool)taskWrapper.Concurrent; + // 并行执行 - if (_concurrent) + if (concurrent) { Parallel.For(0, 1, async _ => { diff --git a/framework/Furion/TaskQueue/Internal/TaskWrapper.cs b/framework/Furion/TaskQueue/Internal/TaskWrapper.cs index 5305bca58a9..b269096caaa 100644 --- a/framework/Furion/TaskQueue/Internal/TaskWrapper.cs +++ b/framework/Furion/TaskQueue/Internal/TaskWrapper.cs @@ -18,10 +18,15 @@ public sealed class TaskWrapper /// /// 任务 ID /// - public Guid TaskId { get; internal set; } + public object TaskId { get; internal set; } /// /// 任务处理委托 /// public Func Handler { get; internal set; } + + /// + /// 是否采用并行执行 + /// + public object Concurrent { get; internal set; } = null; } \ No newline at end of file diff --git a/framework/Furion/TaskQueue/TaskQueued.cs b/framework/Furion/TaskQueue/TaskQueued.cs index 06c7a992d0d..f08f25b8c50 100644 --- a/framework/Furion/TaskQueue/TaskQueued.cs +++ b/framework/Furion/TaskQueue/TaskQueued.cs @@ -18,11 +18,13 @@ public static class TaskQueued /// 任务处理委托 /// 延迟时间(毫秒) /// 任务通道 - /// - public static Guid Enqueue(Action taskHandler, int delay = 0, string channel = null) + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale + /// + public static object Enqueue(Action taskHandler, int delay = 0, string channel = null, object taskId = null, object concurrent = null) { var taskQueue = App.GetRequiredService(App.RootServices); - return taskQueue.Enqueue(taskHandler, delay, channel); + return taskQueue.Enqueue(taskHandler, delay, channel, taskId, concurrent); } /// @@ -31,11 +33,13 @@ public static Guid Enqueue(Action taskHandler, int delay = 0, /// 任务处理委托 /// 延迟时间(毫秒) /// 任务通道 + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale /// - public static async ValueTask EnqueueAsync(Func taskHandler, int delay = 0, string channel = null) + public static async ValueTask EnqueueAsync(Func taskHandler, int delay = 0, string channel = null, object taskId = null, object concurrent = null) { var taskQueue = App.GetRequiredService(App.RootServices); - return await taskQueue.EnqueueAsync(taskHandler, delay, channel); + return await taskQueue.EnqueueAsync(taskHandler, delay, channel, taskId, concurrent); } /// @@ -43,13 +47,15 @@ public static async ValueTask EnqueueAsync(Func /// 任务处理委托 /// Cron 表达式 - /// 任务通道 /// - /// - public static Guid Enqueue(Action taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null) + /// 任务通道 + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale + /// + public static object Enqueue(Action taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null, object taskId = null, object concurrent = null) { var taskQueue = App.GetRequiredService(App.RootServices); - return taskQueue.Enqueue(taskHandler, cronExpression, format, channel); + return taskQueue.Enqueue(taskHandler, cronExpression, format, channel, taskId, concurrent); } /// @@ -59,10 +65,12 @@ public static Guid Enqueue(Action taskHandler, string cronExpr /// Cron 表达式 /// /// 任务通道 + /// 任务 Id + /// 是否采用并行执行,仅支持 null,true,fale /// - public static async ValueTask EnqueueAsync(Func taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null) + public static async ValueTask EnqueueAsync(Func taskHandler, string cronExpression, CronStringFormat format = CronStringFormat.Default, string channel = null, object taskId = null, object concurrent = null) { var taskQueue = App.GetRequiredService(App.RootServices); - return await taskQueue.EnqueueAsync(taskHandler, cronExpression, format, channel); + return await taskQueue.EnqueueAsync(taskHandler, cronExpression, format, channel, taskId, concurrent); } } \ No newline at end of file diff --git a/samples/Furion.Application/TestTaskQueue.cs b/samples/Furion.Application/TestTaskQueue.cs index ce96b04b526..78f09060033 100644 --- a/samples/Furion.Application/TestTaskQueue.cs +++ b/samples/Furion.Application/TestTaskQueue.cs @@ -94,7 +94,7 @@ await TaskQueued.EnqueueAsync(async (_, _) => await Task.Delay(5000); } Log.Information($"这是{s}结束时间:" + DateTime.Now); - }); + }, concurrent: false); } }