【发布时间】:2013-06-09 12:59:00
【问题描述】:
我一直在试图弄清楚如何以 Task 类型返回数据,而不是像这样的 int,例如 Task<Dictionary<string, string>>。
我似乎找到的所有示例都显示返回Task<int>。说return 42;很容易做到。
我一直在尝试编写的函数是这样的:
Task<Dictionary<string, string>> getDamaged()
{
Task<Dictionary<string, string>> d = new Task<Dictionary<string, string>>();
Dictionary<string, string> e = new Dictionary<string, string>();
foreach (Building i in buildingArray)
{
if (Convert.ToInt32(i.efficiency) < 100)
{
e.Add(i.buildingID, i.buildingName);
//d.Add(i.buildingID, i.buildingName); // this does not work, either
}
}
我发现Task.FromResult method 看起来很有希望,但进一步的调查似乎表明TResult 是一项已完成的任务,对我来说听起来不一定像await 那样。
关于如何使其正常工作的任何想法?
更新
这种方法的重点是我试图从我的 UI 线程中卸载工作以保持我的 UI 响应。这是我第一次尝试真正尝试使用带有 .net4.5 的 Visual Studio 2012 来做到这一点。上面的代码是我凭记忆写的。我将发布我一直在尝试的实际代码以及注释掉的失败尝试。
真正困扰我的一个部分是,如果我的返回类型是任务,则如果我返回一个 int,但如果我尝试使用字典,我会收到一个错误,即无法将字典隐式转换为任务
private Task<Dictionary<string, string>> GetDamagedBuildings()
{
//Task<Dictionary<string, string>> damagedBuildings = new Task<Dictionary<string,string>>();
Dictionary<string, string> d = new Dictionary<string, string>();
foreach (ButtonPlanetMap i in buttonArray)
{
//Dictionary<string, string> d = new Dictionary<string,string>();
if (Convert.ToInt32(i.efficiency) < 100)
{
d.Add(i.buildingID.ToString(), i.buildingName);
//(Dictionary<string, string>)damagedBuildings.
}
}
//damagedBuildings = Cast d;
//return damagedBuildings;
return d;
}
【问题讨论】:
-
将函数标记为
async。 -
为什么它需要是
Task?你的方法是完全同步的,那何必呢?你不能只返回一个Dictionary<string, string>吗? -
Kirill Shlenskiy 我打算将此方法作为我可以在另一种方法中等待的方法。据我对 async 和 await 的理解,使用关键字 async 你必须在函数的某个地方有一个 await 。并且 await 仅在调用另一个返回任务的方法时才有效。如果我的理解有误,请纠正我。
-
@Jazzeroki:你的问题相当混乱;李和我各自从不同的假设中回答。 Svick 有最好的答案,涵盖了我们的两个答案,而且更清楚。
标签: c# dictionary task async-await