2017-08-11 208 views
-1

我的任务有问题。当我尝试从我的任务中收回返回的变量时,我无法使用.Result属性来获取它。这里是我的代码:为什么不能使用Task <>。Result属性?

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

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

我得到一个错误saing:

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

this microsoft website例如作品,我不明白为什么。

+6

好,好消息,因为你在这里使用Task是完全没有意义的。您正在阻止当前线程,因此您可以直接调用imageHashing并跳过Task.Run。 – Will

+3

你需要声明它为'任务'。看到[这个问题](https://stackoverflow.com/questions/11333297/threading-tasks-task-does-not-contain-a-definition-for-result)的解释。 –

+0

或者使用var而不是 –

回答

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线程,不想阻止用户界面,然后用await代替Result

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

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

-2

你应该申报缓冲变量Task<byte[]> buffering = Task<byte[]>.Run(() => imageHashing(nextElement));

相关问题