2

私は、このような int 以外のタイプ Task でデータを返す方法を理解しようとしています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 メソッドを見つけましたが、さらに調査するとTResult、完了したタスクとして、必ずしもあなたができるタスクのようには聞こえないことがわかりますawait

これを正しく機能させる方法についてのアイデアはありますか?

アップデート

このメソッドのポイントは、UI スレッドから作業をオフロードして、UI の応答性を維持しようとしていることです。これは、Visual Studio 2012 と .net4.5 を使用して実際にこれを行う最初の試みの 1 つです。上記のコードは、私が記憶から書いたものです。私が試みた実際のコードと、コメントアウトされた失敗した試みを投稿します。

私を本当に悩ませている部分の 1 つは、戻り値の型がタスクの場合に 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;
    }
4

3 に答える 3

2

を使用Task.FromResultすると、メソッドが同期的に実行され、完了したタスクが返されますが、これはおそらく意図したものではありません (ただし、完了したタスクを待つことはできます)。

TaskFactory.StartNewを使用して新しいタスクを開始できます。.Net 4.5 を使用している場合は、代わりにTask.RunTaskFactory.StartNewを使用できます。これは、いくつかの一般的なデフォルト引数を使用します。

Task<Dictionary<string,string>> GetDamaged()
{
    return Task.Factory.StartNew(() => {
        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);
            }
        }

        return e;
    }
}
于 2013-06-08T11:17:00.320 に答える
1

asyncメソッドの戻り値が の場合Task<int>、コードは を返す必要がありintます。同様に、asyncメソッドの戻り値が のTask<Dictionary<string, string>>場合、コードは を返す必要がありDictionary<string, string>ます。

async Task<Dictionary<string, string>> getDamagedAsync()
{
    Dictionary<string, string> e = new Dictionary<string, string>();

    var buildingArray = await GetBuildingsAsync();
    foreach (Building i in buildingArray)
    {
        if (Convert.ToInt32(i.efficiency) < 100)
        {
            e.Add(i.buildingID, i.buildingName);
        }
    }

    return e;
}
于 2013-06-08T13:22:12.920 に答える