返回Task <Dictionary <string,string >>类型的任务

Jaz*_*oki 2 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
        }
    }
Run Code Online (Sandbox Code Playgroud)

我发现Task.FromResult方法看起来有点前途,但进一步调查似乎表明,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;
    }
Run Code Online (Sandbox Code Playgroud)

svi*_*ick 5

没有什么特别之处int,你可以Dictionary用同样的方法从你的方法中返回一个.

你究竟应该做什么取决于你的方法为什么会返回一个Task.

  1. 如果你没有充分的理由Task退货,请不要退货Task,Dictionary直接退货.
  2. 如果你要返回一个Task来完成一个接口,但你实际上并不想让你的方法异步,那么这Task.FromResult()是一个很好的解决方案.你可以使用这样的东西:return Task.FromResult(dictionary);.这Task仍然可以await编辑,只是await意志立即完成.
  3. 如果你要返回a Task因为你的方法是CPU密集型而你想在后台线程上执行它,那么你应该使用Task.Run():

    return Task.Run(() =>
    {
        var dictionary = new Dictionary<string, string>();
        …
        return dictionary;
    });
    
    Run Code Online (Sandbox Code Playgroud)

    但这样做通常不是一个好主意,请参阅我是否应该为同步方法公开异步包装器?