【问题标题】:Why can't use Task<>.Result property?为什么不能使用 Task<>.Result 属性?
【发布时间】:2016-08-30 07:44:16
【问题描述】:

我的任务有问题。当我尝试从任务中接收返回的变量时,我无法使用 .Result 属性来获取它。这是我的代码:

var nextElement = dir.GetValue(i++).ToString();
Task buffering = Task<byte[]>.Run(() => imageHashing(nextElement));
bitmapBuffer = buffering.Result;

imageHasing 函数声明如下:public bool[] imageHashing(string path)

我收到一条错误消息:

严重性代码描述项目文件行抑制状态 错误 CS1061“任务”不包含“结果”的定义并且没有 扩展方法“结果”接受“任务”类型的第一个参数 可以找到(您是否缺少 using 指令或程序集 参考?)

来自this microsoft website 的示例有效,我不明白为什么。

【问题讨论】:

  • 好吧,好消息,因为您在这里使用 Task 完全没有意义。您正在阻塞当前线程,因此您可以直接调用 imageHashing 并跳过 Task.Run。
  • 您需要将其声明为Task&lt;byte[]&gt;。有关说明,请参阅this question
  • 或者改用var
  • 我的意思是这并非完全没有意义,它增加了生成线程池线程然后使用它的额外开销,因此它使您的代码很多效率降低跨度>

标签: c# task


【解决方案1】:

您应该使用Task&lt;bool[]&gt; 作为缓冲变量。不指定类型意味着该操作不会返回任何结果。

【讨论】:

    【解决方案2】:

    您应该将缓冲变量声明为Task&lt;byte[]&gt; buffering = Task&lt;byte[]&gt;.Run(() =&gt; imageHashing(nextElement));

    【讨论】:

      【解决方案3】:

      正如其他人所指出的,编译器错误出现在您的变量声明中(Task 没有Result 属性):

      var nextElement = dir.GetValue(i++).ToString();
      var buffering = Task.Run(() => imageHashing(nextElement));
      bitmapBuffer = buffering.Result;
      

      不过,这段代码也有问题。特别是,如果您只是要阻塞当前线程直到它完成,那么将工作启动到后台线程是没有意义的。您也可以直接调用该方法:

      var nextElement = dir.GetValue(i++).ToString();
      bitmapBuffer = imageHashing(nextElement);
      

      或者,如果您在 UI 线程上并且不想阻塞 UI,则使用 await 而不是 Result

      var nextElement = dir.GetValue(i++).ToString();
      bitmapBuffer = await Task.Run(() => imageHashing(nextElement));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-12
        • 1970-01-01
        • 2020-08-10
        • 1970-01-01
        • 1970-01-01
        • 2021-07-25
        相关资源
        最近更新 更多