c# - 返回类型为 Task<Dictionary<string, string>> 的任务

标签 c# dictionary task async-await

我一直在尝试弄清楚如何返回 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 的原因。

  1. 如果您没有充分理由返回Task,请不要返回Task,直接返回Dictionary
  2. 如果您要返回一个Task 来实现一个接口(interface),但您实际上并不想让您的方法异步,Task.FromResult() 是一个很好的选择解决方案。您可以像这样使用它:return Task.FromResult(dictionary);。这样的Task仍然可以await,只是await会立即完成。
  3. 如果您要返回一个 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/

相关文章:

c# - 为什么任务不显示已取消状态

c++ - OpenMP 4 中的任务依赖性

c# - 无法从 Json 对象获取数据

javascript - 如何在 JavaScript 中创建异步任务

C# - 在其他程序中编辑时实时更新 BackgroundImage

python - 将元组列表转换为字典并保留重复项

python - 声明字典时如何保留键的顺序

python - 从 3 个列表的 zip 中创建字典

c# - WPF WebBrowser 控件 - 如何抑制脚本错误?

c# - 将用户帐户信息存储在单例对象上