我一直在尝试弄清楚如何返回 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;
}
最佳答案
int
没有什么特别之处,您可以用完全相同的方式从您的方法返回一个Dictionary
。
您究竟应该做什么取决于您的方法返回 Task
的原因。
- 如果您没有充分理由返回
Task
,请不要返回Task
,直接返回Dictionary
。 - 如果您要返回一个
Task
来实现一个接口(interface),但您实际上并不想让您的方法异步,Task.FromResult()
是一个很好的选择解决方案。您可以像这样使用它:return Task.FromResult(dictionary);
。这样的Task
仍然可以await
,只是await
会立即完成。 如果您要返回一个
Task
因为您的方法是 CPU 密集型的并且您想在后台线程上执行它,那么您应该使用Task.Run()
:return Task.Run(() => { var dictionary = new Dictionary<string, string>(); … return dictionary; });
但这样做通常不是一个好主意,请参阅 Should I expose asynchronous wrappers for synchronous methods?
关于c# - 返回类型为 Task<Dictionary<string, string>> 的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16998753/