任务是否可以重复使用

本文关键字:是否 任务 | 更新日期: 2023-09-27 18:26:19

假设我有这样的东西:

Task task0_1 = new Task(() => CopyFiles(now, Offset, true));
Task task0_2 = new Task(() => CopyFiles(now, Offset, true));
task0_1.Start();
task0_2.Start();
Task.WaitAll(task0_1, task0_2);
task0_1 = new Task(() => CopyFiles(0, 0, false));
task0_2 = new Task(() => CopyFiles(0, 0, false));

正如您所看到的,一旦两个任务都完成了(在Task.WaitAll之后),我会再次以相同的方式调用CopyFiles,重用task0_1task0_2,但使用不同的参数。

重用这些任务明智吗?项目正在构建,但我不确定这有多"正确"。

任务是否可以重复使用

task0_1是一个变量,与任何其他变量类型一样,您可以重用它,同时这将使代码可读和可维护,因为您使用的是Task.WaitAll,但要小心,因为使用Task.WaitAll时会丢失任务的异步方面这里是的一个例子

 Task task1 = Task.Factory.StartNew(() =>
                {
                    for (int i = 0; i < 10000; i++)
                    {
                        Console.WriteLine( "task1" +i);
                    }
                });
            Task task2 = Task.Factory.StartNew(() =>
            {
                for (int i = 0; i < 10000; i++)
                {
                    Console.WriteLine("task2" + i);
                }
            });
            Task.WaitAll(task1, task2); 
            Console.WriteLine("hi I'm Here "); // hi  im here will not printed until the others 2 tasks has finished so beaware of this on UI 
            Console.ReadLine(); 

从变量命名的角度来看,我不建议对不同的对象重复使用同一个变量,因为为变量命名是一种很好的做法,这样你就可以描述你的对象,而类似的事情可能会非常令人困惑:

var dog = new Mammal(Mammals.Dog);
//some code
dog = new Mammal(Mammals.Cat);
// dog actually is a cat

然而,如果您不关心可读性,那么您的方法就没有错。

在我看来,重用Task没有错,因为它基本上是一个类。

在MSDN中:

http://msdn.microsoft.com/en-us/library/system.threading.tasks.task(v=vs.110).aspx

[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, 
    ExternalThreading = true)]
public class Task : IAsyncResult, IDisposable

从上面的代码来看,Task是一个实现接口的类。

所以,为了回答你的问题,是的,你可以重用它,因为它是一个类,而且因为它是类,它基本上是对所创建对象的引用。