【问题标题】:Cannot implicitly convert type 'int' to '...Tasks<int>'无法将类型“int”隐式转换为“...Tasks<int>”
【发布时间】:2013-03-17 14:42:27
【问题描述】:

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

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;
}

【问题讨论】:

  • 为什么你需要返回一个Task&lt;int&gt; 而不仅仅是一个普通的int?
  • 我需要它在另一个线程上运行。如何将 UI 中的指令传递给任务?
  • 您似乎误以为异步方法在另一个线程上运行。它不是。异步方法包含一个异步等待,并且在等待发生时立即返回。然后,当等待的值可用时,它从中断处继续。确保你明白这一点; 绝对不是这种情况,异步方法必须在另一个线程上运行;事实上,我们在 C# 中添加异步方法的原因之一是减少对线程作为异步机制的依赖。
  • 看你的代码,好像是控件的读写字段;如果是这样的话,这个方法可能只能在 UI 线程上运行。坦率地说,这段代码看起来很可疑。如果我是你,我会做的是开始一个新问题,仔细描述你想要做什么,并寻求帮助来实现它。

标签: c# task


【解决方案1】:

嗯,你可以返回一个已完成的任务:

return Task.FromResult(count);

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

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

【讨论】:

    【解决方案2】:

    正如错误明确指出的那样,您不能将int 作为Task&lt;int&gt; 返回。 (除非您将其设为 async 方法,该方法在编译时魔术以创建 Task&lt;T&gt;。

    如果您的方法不是异步的,那么您首先不应该返回 Task&lt;T&gt;。
    而是直接返回int。

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

    【讨论】:

      【解决方案3】:

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

      但是,如果您坚持返回 Task&lt;int&gt; 而不是 int,则可以使用以下内容作为您的返回声明

      return Task.FromResult(count)
      

      这会将您的int 包装成Task&lt;int&gt;。更多Task.FromResult的信息,您可以访问: https://msdn.microsoft.com/en-us/library/hh194922(v=vs.110).aspx What is the use for Task.FromResult<TResult> in C#

      【讨论】:

        【解决方案4】:

        除了您声明它返回Task&lt;int&gt;之外,此方法中没有任何内容表明它是异步方法。

        但是,您返回的不是Task&lt;int&gt;,而是count、int。

        由于您不等待操作完成,我将删除 Task&lt;int&gt; 返回类型并仅将其替换为 int,因为此方法是完全同步的(您不等待的部分除外无论如何)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多