提问者:小点点

从一个只返回Task而不返回taskt>的方法返回什么?


返回什么?

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

我早些时候问过类似的问题,可能在我当时的情况下是有效的,但我现在不记得当时的情况了。此外,这个线程似乎暗示了同样的事情,我正在尝试。我不知道为什么它对我不起作用。

更新

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

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

共3个答案

匿名用户

您可以将看作是为您构造一个包装器。如果不使用,那么可以返回一个实际的对象。

您的第一个代码示例是使用,但随后您尝试返回一个。用返回n不是必需的:

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.
}

您的第二个代码示例删除了,然后尝试不返回任何内容;在本例中,由于没有为您创建一个,因此您需要自己创建一个:

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

  return Task.FromResult(0);
}

第一个示例(其中为您创建)更为地道。注意,您还应该在方法中使用

匿名用户

删除async关键字,使其变为

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

您不需要等待。即使您将使用将作为方法的最后一部分来执行实际工作的任务。参见等待任务:等待后无代码返回任务或等待

匿名用户

嗯,我返回只是为了让它闭嘴。我不知道纯粹主义者会怎么说。它似乎起了作用,而且我认为它是无害的?

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;