Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.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# 无法对已完成的任务调用start_C#_Task - Fatal编程技术网

C# 无法对已完成的任务调用start

C# 无法对已完成的任务调用start,c#,task,C#,Task,我得到了这个简单的代码。当单击按钮DoSomething()时,DoSomethingElse()和DoEvenMore()运行良好,我等待它完成 void Button1Click(object sender, System.EventArgs e) { Task one = new Task(() => DoSomething()); Task two = new Task(() => DoSomethingElse()); Task three = new T

我得到了这个简单的代码。当单击按钮DoSomething()时,DoSomethingElse()和DoEvenMore()运行良好,我等待它完成

void Button1Click(object sender, System.EventArgs e)
{
   Task one = new Task(() => DoSomething());
   Task two = new Task(() => DoSomethingElse());
   Task three = new Task(() => DoEvenMore());

   one.start();
   two.start();
   three.start();
}

void DoSomething()
{
   label1.Text = "One started";

}

void DoSomethingElse()
{
   label1.Text += "Two started";

}

void DoEvenMore()
{
   label1.Text += "Three started";

}

现在,如果我在不退出程序的情况下再次单击按钮,我会收到上述meessage的InvalidOperationException。我应该怎么做才能在每次单击按钮时执行相同的任务,而不必退出程序

此代码适用于我,我可以多次单击按钮而不会在标题中抛出错误:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
   public partial class Form1 : Form
   {
      public Form1()
      {
         InitializeComponent();
      }

  void Button1Click(object sender, System.EventArgs e)
  {
     Task one = new Task(() => DoSomething());
     Task two = new Task(() => DoSomethingElse());
     Task three = new Task(() => DoEvenMore());

     one.Start();
     two.Start();
     three.Start();
  }

  void DoSomething()
  {
     if (InvokeRequired) Invoke((MethodInvoker)delegate { DoSomething(); });
     else label1.Text = "One started";

  }

  void DoSomethingElse()
  {
     if (InvokeRequired) Invoke((MethodInvoker)delegate { DoSomethingElse(); });
     else label1.Text += "Two started";

  }

  void DoEvenMore()
  {
     if (InvokeRequired) Invoke((MethodInvoker)delegate { DoEvenMore(); });
     else label1.Text += "Three started";

  }
   }

}

这些方法的作用是什么?这里的代码都没有对任务调用
Start
,因此不会生成该错误。其中一个方法必须在其主体中对某个任务调用
Start
。现在修复。异常发生在第一次启动()时;他们只是把“任务一、二、三完成”打印到标签上。这就是为什么发布一个能够复制您实际遇到的问题的示例非常重要。目前该能源部不会;你从来不会多次开始一项任务。这正是我的代码,因为它是用于学习目的的。如果我点击一次,一切正常。如果我点击两次,就会出现异常。我继续;我的表单上有一个标签和一个按钮,上面没有其他代码。这些代码不会生成您指出的错误消息。您没有对已完成的任务调用start。您所做的是从一个非UI线程访问UI元素,因此您将得到一个错误,但这是一个完全不同的错误。它也不会编译,因为您没有正确拼写
Start
。显然这不是你的代码。你可以把它缩短一点:
if(invokererequired)Invoke((Action)DoSomething)。我消除了条件语句,只需从任务中调用
Invoke()
newtask(()=>Invoke((Action)DoSomething))是的,在这种情况下你可以。我喜欢使用这种语法,因为它可以在我希望运行的相同方法(因此是条件)中使用,而不管需要在其中运行多少代码(在else中)。如果我使用任务,那么我必须将代码放在匿名方法或单独的方法中。