【问题标题】:How to create a new Task of type Task?如何创建任务类型的新任务?
【发布时间】:2017-07-28 12:04:26
【问题描述】:

我有:

async Task doWork() { Console.WriteLine("do some async work in this method"); }

Task task = new Task(doWork);   //line X
task.Start();
task.Wait();

第 X 行给出编译错误:

CS0407 'Task Form1.doWork()' 返回类型错误

如何实例化一个新任务doWork

我可以使用以下方法,但它给我带来了一系列不同的问题。

Task task = doWork();
task.Wait();

我想避免第二种方法。如何在第 X 行实例化 async Task 类型的新 Task

【问题讨论】:

  • Task task = doWork(); 但任务将是同步的,因为您不在函数内部使用await
  • 您显然查看了msdn.microsoft.com/en-us/library/dd321321(v=vs.110).aspx 以了解需要什么类型 - 有点不清楚您有什么问题......您能解释一下您真正想用这段代码实现什么吗?
  • @Gusman,是的,await 里面有 doWork 的东西,但它不应该仍然适用于空任务吗?我剥离了实际代码,以免混淆问题。
  • 对不起,我想我不明白你的问题,你的意思是什么?任务可能异步执行,也可能不异步执行,这取决于计划者的决定,但在 async 函数的情况下有一个特殊考虑,只有 awaited 调用将使函数异步执行(而不是总是,取决于计划者),如果你不添加任何await,它肯定会同步执行。如果您想要在新的异步任务中执行同步代码,则不要将该函数标记为async,返回void 并使用Task.Run(yourFunction);
  • 执行部分我还没来。到目前为止,我还有一个编译问题。

标签: c# .net task


【解决方案1】:

在这种情况下,您可能想要将doWork 定义为具有void 的返回类型。然后你可以使用Task 构造函数和Action (see docs) 的参数初始化task

或者,您可以使用

Task task = doWork();

请参阅here,了解这两种技术之间的权衡。

【讨论】:

  • 谢谢。如果我需要doWorkTask 类型,我应该如何在new Task 构造函数语句中实例化它?
  • @OldGeezer 为什么需要使用Task 构造函数?
  • 用于学术理解。我试图弄清楚如何从非异步任务中调用异步任务,并且只有在被调用的任务完全完成后才返回调用者。
【解决方案2】:

由于 doWork() 的返回类型为 Task,因此声明需要是泛型 Task<TResult> 的实例 - 即 Task<Task>

【讨论】:

  • 是的! Task<Task> task = new Task<Task>(doWork)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 2011-12-19
  • 2012-03-28
相关资源
最近更新 更多