立即返回一个 Task<bool>

59

我有一份任务清单需要等待完成。我正在等待,就像下面这样:

    await TaskEx.WhenAll(MyViewModel.GetListOfTasks().ToArray());

MyViewModel.GetListOfTasks() 返回 Task 的列表:

    var tasksList = new List<Task>();
    foreach (var item in Items)
    {                
        tasksList.Add(item.MyTask());
    }

现在,我想返回一个虚拟任务,它会立即完成。但是,TaskEx.WhenAll将永远等待它:

    public Task<bool> MyTask()
    {
        return new Task<bool>(() => false);
    }

如何返回一个立即完成的任务(Task)?


你应该使用不同的服务层来模拟这个吗? - David L
@DavidL 是的,这就是我要做的事情,但目前我只是在尝试新的架构,所以我想先用虚拟数据填充它,然后再开始实现。 - Vitalii Vasylenko
6
返回 Task.FromResult(false); - Fabio Marcolini
@FabioMarcolini 谢谢,可以用!对于wp7,应该是返回TaskEx.FromResult(false); 但你是正确的。 - Vitalii Vasylenko
你正在创建一个任务,但是你从未运行它。 - user2674389
@user2674389 为什么不呢?如果使用await来放置任务,它可以正常工作。 - Vitalii Vasylenko
2个回答

116

4
自从框架的最终版本发布以来,它的返回值是:return Task.FromResult(false); - uli78
1
@uli78 这个问题是关于Windows Phone 7的,但你说得很好!我已经更新了我的答案,谢谢! - David L
如果代码是这种形式,你应该添加 await:public async Task<bool> MyTask() { return await Task.FromResult(false); } - Anand - MCSA MCPD MCTS MCSD
在 OP(和您)的示例中,没有理由生成一个额外的状态机来等待 @Anand-MCSAMCPDMCTSMCSD。 - David L

11

在 .NET 4.5 之前,你可以使用 TaskCompletionSource<TResult> 模拟 FromResult 方法。

public static Task<TResult> FromResult<TResult>(TResult result)
{
    var completionSource = new TaskCompletionSource<TResult>();
    completionSource.SetResult(result);
    return completionSource.Task;
}

但是我为什么要模拟它呢?不管怎样,还是谢谢。 - Vitalii Vasylenko
由于在 .NET 4.5 之前,没有 FromResult 方法。 - Sam Harwell
但是..嗯.. http://msdn.microsoft.com/en-us/library/hh194922(v=vs.110).aspx - 我猜,是吧? - Vitalii Vasylenko
@ScottChamberlain 但是我们在谈论4.5吗? - Vitalii Vasylenko
@280Z28 好的,无论如何,感谢你的回答 - 记住类似物并了解内部结构总是很有用的。 - Vitalii Vasylenko
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接