访问任务的“结果”属性
本文关键字:属性 结果 任务 访问 | 更新日期: 2023-09-27 18:14:36
我正在尝试使用c# Facebook SDK检索专辑的ID。然而,我得到以下错误:
System.Threading.Tasks。Task'不包含'Result'的定义,也没有扩展方法'Result'接受类型为'System.Threading.Tasks '的第一个参数。可以找到任务
请查看下面的代码,每行
前出现错误try
{
string wallAlbumID = string.Empty;
FacebookClient client = new FacebookClient(accessToken);
client.GetTaskAsync(pageID + "/albums")
.ContinueWith(task =>
{
if (!task.IsFaulted)
{
foreach (dynamic album in task.Result.data)
{
if (album["type"] == "wall")
{
wallAlbumID = album["id"].ToString();
}
}
}
else
{
throw new DataRetrievalException("Failed to retrieve wall album ID.", task.Exception.InnerException);
}
});
return wallAlbumID;
}
对于记录,FacebookClient.GetTaskAsync
方法返回Task<object>
我不知道Facebook API,但错误似乎表明,您正在处理没有Result
属性的Task
类(非通用)。它是从非泛型Task
类派生出来的泛型Task<T>
才具有该属性。它们都允许异步运行代码,但是泛型类能够运行返回值的方法。
如果GetTaskAsync
返回Task
而不是Task<T>
,那么这意味着你不能从它那里得到结果,因为它在后台运行的操作不返回任何东西
当我编译你的代码时,我得到两个错误,第一个是你提到的,第二个是:
'object'不包含'data'的定义,并且找不到接受'object'类型的第一个参数的'data'扩展方法
第二个错误是您的实际错误:task.Result
是object
,但(我假设)您想将其视为dynamic
。由于这个错误,编译器还尝试使用ContinueWith()
的重载,它只使用Task
,而不是Task<object>
,这就是为什么也得到第一个错误。
要修复此错误,您应该将task.Result
转换为dynamic
:
dynamic result = task.Result;
foreach (dynamic album in result.data)
这将编译得很好,但实际上它不会工作,因为您在从封闭方法返回后设置了局部变量。
如果你使用的是c# 5.0,你应该在这里使用await
,而不是ContinueWith()
:
try
{
dynamic result = await client.GetTaskAsync(pageID + "/albums");
foreach (dynamic album in result.data)
{
if (album["type"] == "wall")
{
return (string)album["id"].ToString();
}
}
return string.Empty;
}
catch (Exception e) // you should use a specific exception here, but I'm not sure which
{
throw new DataRetrievalException("Failed to retrieve wall album ID.", e);
}
如果你不能使用c# 5.0,那么你的整个方法应该返回由ContinueWith()
返回的Task<string>
:
return client.GetTaskAsync(pageID + "/albums")
.ContinueWith(
task =>
{
if (!task.IsFaulted)
{
dynamic result = task.Result;
foreach (dynamic album in result.data)
{
if (album["type"] == "wall")
{
return (string)album["id"].ToString();
}
}
return string.Empty;
}
else
{
throw new DataRetrievalException(
"Failed to retrieve wall album ID.", task.Exception.InnerException);
}
});