从返回Task而不是Task <t>的方法返回什么?

时间:2016-06-05 21:17:04

标签: c# .net asynchronous async-await task-parallel-library

我从D4()返回什么?

async static Task D4()
{
    Console.Write("Enter the divisor: ");
    var n = int.Parse(Console.ReadLine());
    Console.WriteLine((24 / n).ToString());

    // NONE OF THESE WORK
    // THE COMPILER COMPLAINS WITH AN ERROR THAT SAYS:
    // Since 'Program.D4()' is an async method that returns 'Task', 
    // a return keyword must not be followed by an object expression.
    // Did you intend to return 'Task<T>'?
    // return new TaskCompletionSource<object>().Task;
    // return Task.FromResult<object>(null);
    // return Task.FromResult<bool>(false);
    // return Task.FromResult(0);
}

我之前问过something similar,它可能在我的情况下有效,但我现在对这种情况没有回忆。此外,this thread似乎暗示了我正在尝试的同样的事情。我不确定为什么它在我的情况下不起作用。

更新

为了完整起见,这里是整个相关的代码。

async static Task A4() { await B4(); }
async static Task B4() { await C4(); }
async static Task C4() { await D4(); }
async static Task D4()
{
    Console.Write("Enter the divisor: ");
    var n = int.Parse(Console.ReadLine());
    Console.WriteLine((24 / n).ToString());

    // return new TaskCompletionSource<object>().Task;
    // return Task.FromResult<object>(null);
    // return Task.FromResult<bool>(false);
    // return Task.FromResult(0);
}

4 个答案:

答案 0 :(得分:27)

您可以将async视为为构建Task包装。如果您不使用async,则可以返回实际的Task对象。

您的第一个代码示例是使用async,但之后您尝试返回Task。使用Task

返回async不是必需的
async static Task D4()
{
  Console.Write("Enter the divisor: ");
  var n = int.Parse(Console.ReadLine());
  Console.WriteLine((24 / n).ToString());

  return; // May be removed, since it is implicit.
}

您的第二个代码示例删除了async,然后尝试不返回任何内容;在这种情况下,由于async不为您创建Task,您需要自己创建一个:

static Task D4()
{
  Console.Write("Enter the divisor: ");
  var n = int.Parse(Console.ReadLine());
  Console.WriteLine((24 / n).ToString());

  return Task.FromResult(0);
}

第一个示例(其中async为您创建Task)更为惯用。请注意,您还应该使用await方法中的async

答案 1 :(得分:1)

删除async关键字,使其成为

static Task D4()
{
    return Task.FromResult(0); // or one of the others from your post
}

您不需要等待Task.FromResult()。即使您使用Task.Run()作为方法的最后部分进行实际工作的任务。见Awaiting tasks: Return task or await if no code after await

答案 2 :(得分:0)

您不会从具有Task作为返回类型的函数返回任何内容。类似于你对void所做的事情。

然而,您可以使用“返回”;再次,因为你可以做无效。

修改

如果在功能减速中包含“async”,则应该能够返回任何内容。

示例表单dotnetfiddle

答案 3 :(得分:0)

好吧,我回复default(Task)只是为了让它闭嘴。我不确定纯粹主义者会对此说些什么。它似乎有效,我认为它是无害的?

static Task D4()
{
    Console.Write("Enter the divisor: ");
    var n = int.Parse(Console.ReadLine());
    Console.WriteLine((24 / n).ToString());

    // return new TaskCompletionSource<object>().Task;
    // return Task.FromResult<object>(null);
    // return Task.FromResult<bool>(false);
    // return Task.FromResult(0);

    return default(Task);
}

对此的一个批评是,来电者将不知道它收到了什么以及它的状态是什么。这是一个例子,我并不在乎,但作为一般原则,我认为应该避免我所说明的内容。

这可能是一个稍微更安全但更昂贵的方法吗?

private static Task cachedNoOpTask = new Task(null);

...

return cachedNoOpTask;