11

これが非同期の場合、エラーなしで返されます。非同期でなくてもエラーがスローされるのはなぜですか。この操作では非同期は価値がありません。

public Task<int> countUp()
{
    string compare = txtTag.Text;
    int count = 0;
    for (int i = 0; i < dataGridView1.Rows.Count; i++)
    {
        if (compare == dataGridView1[0, i].Value.ToString())
        {
            BeginInvoke(new Action(() =>
            {
                count++;
                txtCount.Text = count.ToString();
            }));
        }
    }

    return count;
}
4

4 に答える 4

30

さて、完了した Task を返すことができます:

return Task.FromResult(count);

http://msdn.microsoft.com/en-us/library/hh194922.aspx

ただし、Task を返したい理由は少し謎です。概念的には、Task は将来のある時点で何かが起こるという約束を表します。あなたの場合、それはすでに起こっているので、 Task を使用してもまったく意味がありません。

于 2013-03-17T14:44:04.257 に答える
10

intエラーが明確に述べているように、 をとして返すことはできませんTask<int>。(asyncコンパイル時の魔法を使ってTask<T>.

Task<T>メソッドが非同期でない場合、そもそもa を返すべきではありません。代わりに、直接
戻ってください。int

何らかの理由でを返す必要があるTask<T>場合は、 を呼び出しTask.FromResult()て、指定された値で終了したタスクを作成できます。

于 2013-03-17T14:43:08.723 に答える
3

このメソッドには、 return と宣言したという事実を除いて、非同期メソッドであることを示すものは何もありませんTask<int>

ただし、 を返すのではなく、を返しTask<int>ます。countint

アクションが完了するのを待っていないので、このメソッドは完全に同期的であるため、Task<int>戻り値の型を削除してint代わりに置き換えます (とにかく待っていない部分を除く)。

于 2013-03-17T14:44:47.577 に答える