我从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);
}
答案 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;