可以重复使用任务吗?

时间:2014-10-13 15:30:59

标签: c# .net

我们说我有这样的事情:

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之后),我再次以CopyFilestask0_1的方式再次呼叫task0_2,但不同参数。

重用这些任务是否明智?该项目建立,但我不确定如何纠正'这是。

3 个答案:

答案 0 :(得分:1)

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(); 

答案 1 :(得分:-1)

从变量命名的角度来看,我不建议为不同的对象重用相同的变量,因为命名变量是一个很好的做法,所以你会描述你的对象,这样的事情可能会让人很困惑:

var dog = new Mammal(Mammals.Dog);

//some code

dog = new Mammal(Mammals.Cat);

// dog actually is a cat

但是,如果您不关心可读性,那么您的方法没有任何问题。

答案 2 :(得分:-3)

在我看来,重用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是一个实现接口的类。

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