Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 完成后重新启动阵列中的所有任务_C#_Winforms_Task Parallel Library - Fatal编程技术网

C# 完成后重新启动阵列中的所有任务

C# 完成后重新启动阵列中的所有任务,c#,winforms,task-parallel-library,C#,Winforms,Task Parallel Library,我有一个执行方法的子任务数组,一旦作业完成,我就会收到一个通知并结束。现在,我希望他们重新开始相同的工作,没有任何麻烦。这怎么可能 以下是我创建任务数组和处理任务完成的方式: public void Start() { this.totalRangePerThread = ((this.endRange - this.startRange) / this.subTasks.Length); for (int i = 0; i &

我有一个执行方法的子任务数组,一旦作业完成,我就会收到一个通知并结束。现在,我希望他们重新开始相同的工作,没有任何麻烦。这怎么可能

以下是我创建任务数组和处理任务完成的方式:

public void Start()
        {

            this.totalRangePerThread = ((this.endRange - this.startRange) / this.subTasks.Length);

            for (int i = 0; i < this.subTasks.Length; ++i)
            {
                var copy = startRange;
                this.subTasks[i] = new Task(() => searchItem(copy, this.totalRangePerThread), this.token, TaskCreationOptions.LongRunning);
                this.startRange = this.startRange + this.totalRangePerThread;
            }

            //start tasks
            for (int taskIndex = 0; taskIndex < this.subTasks.Length; ++taskIndex)
            {
                    this.subTasks[taskIndex].Start();     
            }
            Task.Factory.ContinueWhenAll(this.subTasks, completedTasks =>
            {
                //write it onto the the activitylog
                if (Form1.Instance != null)
                {
                    Form1.Instance.BeginInvoke((MethodInvoker)delegate
                    {
                        Form1.Instance.AddItemtoActivityLog("Search Completed!");
                    });
                }
            });

        }
public void Start()
{
this.totalRangePerThread=((this.endRange-this.startRange)/this.subtask.Length);
for(int i=0;isearchItem(复制,this.totalRangePerThread),this.token,TaskCreationOptions.LongRunning);
this.startRange=this.startRange+this.totalRangePerThread;
}
//启动任务
for(int taskIndex=0;taskIndex
{
//将其写入活动日志
if(Form1.Instance!=null)
{
Form1.Instance.BeginInvoke((MethodInvoker)委托
{
Form1.Instance.AddItemtoActivityLog(“搜索完成!”);
});
}
});
}

我应该再次调用
Start()
方法,还是有一种机制可以神奇地重新启动子任务?

您可以将准备和执行子任务的代码提取到一个单独的方法。然后在
Start()
方法中调用它两次:

public void Start()
{
    var yourTasks = new Task[] {
    Task.Factory.StartNew(_ => task1(),
    Task.Factory.StartNew(_ => task2(),
    Task.Factory.StartNew(_ => ...
    Task.Factory.StartNew(_ => taskN() };
    Task.WaitAll(yourTasks ); // wait for all N tasks to complete
    Start();
}
private void ExecuteSubTasks()
{
    var tasks = new Task[]
        {
            new Task(() => Console.WriteLine("SubTask1 executed.")),
            new Task(() => Console.WriteLine("SubTask2 executed.")),
            new Task(() => Console.WriteLine("SubTask3 executed.")),
        };

    foreach (var task in tasks)
        task.Start();
    Task.WaitAll(tasks);
}

private void Start()
{
    var mainTask = Task.Factory.StartNew(() => ExecuteSubTasks())
        .ContinueWith((prev) =>
        {
            ExecuteSubTasks();
            this.Invoke((MethodInvoker)delegate { MessageBox.Show("Completed."); });
        });
}

一个简单的调用continuewhere中的Start()不会有多大伤害,:)@David这是我的第一次尝试。但它没有按预期工作。请尝试Task.WaitAll(),然后调用start();
wait
命令应该放在哪里?我把它放在了一个答案中,因为那里有一些代码。
waitall
命令会停止UI。。我确实想知道,这部分有什么工作吗?waitall命令会停止UI吗?您正在调用UI的线程吗?如果是这样,从新线程调用Start()并不困难,但这与您的原始帖子无关!!!非常紧凑和可行。非常感谢!