2014-09-10 75 views
0

在过去的几个星期里,我一直在看Tasks,我真的很努力。我挣扎的一件事是创建一个没有返回类型的等待方法。什么是任务的回报?

现在,我们现在的非awaitable方法的工作是这样的:

//This is a method with a return type: 
private string methodWithReturn() 
{ 
    return "This is a string return type"; 
} 
//This is a method without a return type 
private void methodWithoutReturn() 
{ 
    //Some random code that has no return 
} 

现在,当它涉及到的任务,它很复杂。有三种类型:void,TaskTask<T> void根本不推荐,所以我留下了两个任务。这是问题。我想有没有返回类型的任务,这是一个代码:

private Task taskTypeMethod() 
{ 
    //some random code 
} 

这里的问题是,它仍然发出警告说,“并不是所有的代码路径返回一个值”。我是否正确理解任务或者我在这里做错了什么?

我被告知要在其之前添加async,但这需要我在代码块内使用await关键字,我不会使用它。

+6

如果你不使用'async' *和*你不会返回一个活的'Task',为什么有一个'Task'作为返回类型呢? – 2014-09-10 18:01:33

+1

你可以显示'taskTypeMethod'里面有什么吗?这听起来像你在做一些同步内部。那么为什么还要回来'Task'? – 2014-09-10 18:06:23

+0

您确实无法正确理解任务。多读一点关于它们的内容并遵循一些教程可能会帮助你。 – 2014-09-10 18:08:00

回答

2

没有返回Task,调用者怎么可能知道您假定正在运行的异步计算何时完成?如果没有人需要知道,则使方法返回Task并忽略返回值。如果由于某种原因不可能,您可以使用async void

如何生成Task返回对于调用者来说并不重要。一个简单的方法是使方法async Task

这里的问题是,它仍然发出“不是所有的代码路径都返回一个值”的警告。

那么,这个错误是有道理的。你答应退回,但你没有。这是行不通的。要么拿到一些Task并返回它或使用async Task。也许你需要找出什么async甚至意味着什么。

0

我想你可能会错误地理解Task

如果设置了这样的方法:

private Task taskTypeMethod() 
{ 
    //some random code 
} 

...那么你必须返回一个Task对象。这是方法的基本要求:具有返回类型的那些需要返回该类型的值。

但这并不意味着Task本身必须在完成时返回一个值。你可以做这样的事情:

Task t = Task.Run(() => // some random code); 

这会给你一个Task,将执行你的“随机码”。但“随机码”不需要返回一个值。