11

如果这是异步的,它会返回没有错误,为什么它没有异步就抛出错误,异步在这个操作中毫无价值。

public Task<int> countUp()
{
    string compare = txtTag.Text;
    int count = 0;
    for (int i = 0; i < dataGridView1.Rows.Count; i++)
    {
        if (compare == dataGridView1[0, i].Value.ToString())
        {
            BeginInvoke(new Action(() =>
            {
                count++;
                txtCount.Text = count.ToString();
            }));
        }
    }

    return count;
}
4

4 回答 4

30

好吧,您可以返回一个已完成的任务:

return Task.FromResult(count);

http://msdn.microsoft.com/en-us/library/hh194922.aspx

不过,为什么要返回 Task 有点神秘。从概念上讲,任务代表了未来某个时间会发生某事的承诺。在您的情况下,它已经发生了,因此使用 Task 完全没有意义。

于 2013-03-17T14:44:04.257 回答
10

正如错误明确指出的那样,您不能将 aint作为 a返回Task<int>。(除非你把它变成一个async方法,它在编译时魔法来创建一个Task<T>.

如果您的方法不是异步的,那么您一开始就不应该返回 a Task<T>
相反,直接返回int即可。

如果由于某种原因需要返回 a Task<T>,则可以调用Task.FromResult()以创建具有给定值的已完成任务。

于 2013-03-17T14:43:08.723 回答
4

这里的代码显然是不正确的。尝试查看代码中的返回类型。您正在返回,并且与int期望的返回类型不匹配Task<int>。如果您不打算在此方法中使用 async await,则只需将返回类型更改为int.

但是,如果您坚持要退货Task<int>而不是int,您可以使用以下内容作为您的退货声明

return Task.FromResult(count)

这会将您包装intTask<int>. 更多信息Task.FromResult可以访问: https ://msdn.microsoft.com/en-us/library/hh194922(v= vs.110).aspx Task.FromResult<TResult>在C#中有什么用

于 2016-09-22T04:13:30.893 回答
3

此方法中没有任何内容表明它是异步方法,除了您已将其声明为 return 的事实Task<int>

但是,您不是返回 a Task<int>,而是返回count, an int

由于您不等待操作完成,因此我将删除Task<int>返回类型并将其替换为 justint而不是因为此方法是完全同步的(除了您不等待的部分)。

于 2013-03-17T14:44:47.577 回答