6

Windows Store App の Async メソッドへのパラメーターとして参照を渡すにはどうすればよいですか?
私はこのようなものを探しています:

var a = DoThis(ref obj.value);

public async Task DoThis(ref int value)
{
    value = 10;
}

しかし、エラー:

非同期メソッドに ref または out パラメーターを指定することはできません

他に方法はありますか?

注:
obj.value を正確に渡す必要があります。このメソッドは、異なるタイプのオブジェクト、同じタイプのオブジェクト、1 つのオブジェクトで使用されますが、obj.val_1、obj.val_2、または obj.val_10 を渡します。すべての値は同じ型になります (ex 文字列の場合)

4

4 に答える 4

12

多少のオーバーヘッドやオブジェクトの有効期間の延長を気にしない場合は、次のようにセッターとゲッター メソッドを関数に渡すことで ref の動作をエミュレートできます。

public async Task DoStuff(Func<int> getter, Action<int> setter)
{
    var value1 = getter();
    await DoSomeOtherAsyncStuff();
    setter(value1 * value1);
}

そして、次のように呼び出します。

await DoStuff(() => obj.Value, x => obj.Value = x);
于 2013-05-21T09:13:17.460 に答える
7

オブジェクト自体を直接渡し、メソッド内の対応するプロパティの値を設定できます。

var a = DoThis(obj);

public async Task DoThis(SomeObject o)
{
    o.value = 10;
}

そのようなオブジェクトがない場合は、単純に作成し、非同期メソッドにそのオブジェクトをパラメーターとして取得させます。

public class SomeObject
{
    public int Value { get; set; }
}
于 2013-05-21T07:57:14.910 に答える
2

いつでもTask<>クラスを使用して、目的の値を返すことができます。次に、コードは次のようになります。

var a = DoThis(obj.value);
obj.value = a.Result;

public async Task<int> DoThis(int value)
{
    int result = value + 10; //compute the resulting value
    return result;
}

編集

わかりました、私が考えることができるこれを行う別の方法は、特定のオブジェクトのメンバーの更新をメソッドにカプセル化し、このメソッドを呼び出すアクションをタスクの引数として渡すことです。

var a = DoThis(() => ChangeValue(ref obj.value));

public void ChangeValue(ref int val)
{
    val = 10;
}

public async Task DoThis(Action act)
{
    var t = new Task(act);
    t.Start();
    await t;
}

私がテストした限り、変更は子スレッドで行われましたが、それでもその影響は親スレッドに表示されました。これがお役に立てば幸いです。

于 2013-05-21T08:20:14.183 に答える