C# 无法隐式转换类型';int';至';。。。任务<;int>';

C# 无法隐式转换类型';int';至';。。。任务<;int>';,c#,task,C#,Task,如果这是异步的,它将返回没有错误,为什么它抛出一个错误而不是异步的,异步在这个操作中是没有价值的 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.

如果这是异步的,它将返回没有错误,为什么它抛出一个错误而不是异步的,异步在这个操作中是没有价值的

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;
}
public Task countUp()
{
字符串比较=txtTag.Text;
整数计数=0;
对于(int i=0;i
{
计数++;
txtCount.Text=count.ToString();
}));
}
}
返回计数;
}

正如错误明确指出的,您不能将
int
作为
任务返回。(除非将其设置为
async
方法,该方法在编译时具有创建
任务的魔力

如果您的方法不是异步的,那么首先就不应该返回
任务。
相反,只需直接返回
int

如果出于某种原因,您需要返回一个
任务
,您可以调用
任务.FromResult()
,以创建一个具有给定值的已完成任务。

那么,您可以返回一个已完成的任务:

return Task.FromResult(count);


但是,为什么要返回任务还是有点神秘。从概念上讲,任务表示将来某个时候会发生某些事情的承诺。在您的情况下,它已经发生了,因此使用任务是完全没有意义的。

此方法中没有任何东西表明它是异步方法,除了您已将其声明为返回
任务

但是,您没有返回
任务
,而是返回
计数
,一个
整数


由于您没有等待操作完成,因此我将删除
任务
返回类型,并将其替换为just
int
,因为此方法是完全同步的(您无论如何都不等待的部分除外).

此处的代码显然不正确。请尝试查看代码中的返回类型。您返回的和
int
与预期任务的返回类型不匹配。如果您不打算在此方法中使用async Wait,您可以将返回类型更改为
int

但是,如果您坚持返回
Task
而不是
int
,则可以使用以下返回语句

return Task.FromResult(count)
这将把您的
int
包装到
任务中。有关
任务的更多信息,请从result
访问:

为什么您需要返回一个
任务,而不仅仅是一个普通的
int
?我需要它在另一个线程上运行。如何将UI中的指令传递给任务?您似乎误以为异步方法在另一个线程上运行。它不是。异步方法包含异步等待,并返回im当等待发生时,它会立即恢复。当等待的值可用时,它会恢复到停止的位置。请确保您理解这一点;异步方法绝对不一定在另一个线程上运行;事实上,我们向C#添加异步方法的原因之一是为了减少对作为异步机制的线程的依赖。Lo看看你的代码,它似乎是读写控件的字段;如果是这样的话,这个方法可能只在UI线程上运行。坦率地说,这段代码看起来非常可疑。如果我是你,我会做的是开始一个新问题,仔细描述你正在尝试做什么,并请求帮助实现这一点。