【C#】48. Task WhenAll、WhenAny 创建任务的任务

9 篇文章 2 订阅
2 篇文章 0 订阅

Task中有几个非常方便的并行运行任务的方式,比如WhenAll(当所有Task都运行完毕RanToCompletion)、WhenAny(只要有一个Task运行完毕)等等。本篇就来介绍一下WhenAll和WhenAny。

static int TaskMethod(string name, int seconds)
{
Console.WriteLine("Task {0} 运行在线程 {1} 上。是否是线程池线程: {2}",
name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
Thread.Sleep(TimeSpan.FromSeconds(seconds));
return 42 * seconds;
}


一、WhenAll

var firstTask = new Task<int>(() => TaskMethod("First Task", 3));
var secondTask = new Task<int>(() => TaskMethod("Second Task", 2));
var whenAllTask = Task.WhenAll(firstTask, secondTask);
whenAllTask.ContinueWith(t =>Console.WriteLine("The first answer is {0}, the second is {1}", t.Result[0], t.Result[1]),
TaskContinuationOptions.OnlyOnRanToCompletion
);

firstTask.Start();
secondTask.Start();

这里设置了一个名字为whenAllTask的变量,他是用静态方法Task.WhenAll创建的第三个任务。需要注意的是,由于是基于前面两个任务创建的,因此返回的类型为 Task<int[]>。在firstTask和secondTask运行完毕后(WhenAll), 采用后续操作(ContinueWith),函数中的t其实也就是whenAllTask的传参。后续操作打印出whenAllTask中的Result数组成员,后续操作的状态条件为 whenAllTask的状态为OnlyOnRanToCompletion



二、WhenAny

var tasks = new List<Task<int>>();
for (int i = 1; i < 4; i++)
{
int counter = i;
var task = new Task<int>(() => TaskMethod(string.Format("Task {0}", counter), counter));
tasks.Add(task);
task.Start();
}

while (tasks.Count > 0)
{
var completedTask = Task.WhenAny(tasks).Result;//这里的Result是指代Task<int>!
tasks.Remove(completedTask);
Console.WriteLine("A task has been completed with result {0}.", completedTask.Result);
}

首先建立一个Task List,名字为tasks。而后依次向里添加新任务实例,而且新任务的运行所需时间依次为1、2、3秒。而后,伦查tasks中的任务数量,在循环内 建立completedTask任务,用来表示任一个在tasks中已经完成操作的Task,如果一个任务都没运行完成,则completedTask。需要指出的是, 这里的Result和上例中的不同,上例中t.Result直接指代int[],即返回结果数组;而这里的WhenAny(tasks).Result指的是Task<int>,也就是完成的Task<int>实例




  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 TaskScheduler.dll 可以很方便地创建、修改和删除 Windows 任务计划。以下是一个简单的 C# 示例,演示如何使用 TaskScheduler.dll 创建一个每天执行一次的任务计划: ```csharp using System; using System.IO; using Microsoft.Win32.TaskScheduler; class Program { static void Main(string[] args) { // 创建一个新的计划任务对象 using (TaskService taskService = new TaskService()) { TaskDefinition taskDefinition = taskService.NewTask(); // 设置任务基本属性 taskDefinition.RegistrationInfo.Description = "My Daily Task"; taskDefinition.Principal.LogonType = TaskLogonType.InteractiveToken; taskDefinition.Settings.Enabled = true; // 创建触发器,每天执行一次 DailyTrigger dailyTrigger = new DailyTrigger(); dailyTrigger.Repetition.Interval = TimeSpan.FromDays(1); dailyTrigger.StartBoundary = DateTime.Today.AddHours(9); // 每天 9 点执行 taskDefinition.Triggers.Add(dailyTrigger); // 创建操作,将本地文件复制到远程位置 string sourceFile = @"C:\temp\test.txt"; string destinationPath = @"\\remote\share\test.txt"; CopyAction copyAction = new CopyAction(sourceFile, destinationPath, true); taskDefinition.Actions.Add(copyAction); // 注册任务计划 taskService.RootFolder.RegisterTaskDefinition("My Daily Task", taskDefinition); } } } ``` 在上面的示例中,我们创建了一个名为“My Daily Task”的任务计划,每天 9 点执行。操作是将本地文件复制到远程位置。你可以根据自己的需求修改代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值