0

次のようなSilverlight/WP7アプリケーションの非同期コールバック関数があります。

public static my_function()
{
     PostClient conn = new PostClient(POST);
            conn.DownloadStringCompleted += (object sender2, DownloadStringCompletedEventArgs z) =>
            {
                if (z.Error == null)
                {
                    //Process result
                    string data = z.Result;
                    //MessageBox.Show(z.Result);  

                    //Convert Login value to true false
                    try
                    { ... do stuff here

                    }
}

コールバック関数を使用して、既存のメソッドのデータ値を返すことができるようにしたいと思います。すなわち

public List<Usernames> GetUsernames()
{
       List<Usernames> user_list = my_funtion();
       return user_list;
}

現時点では、コールバック関数に静的変数を更新させています。静的変数はイベントをトリガーし、特にすべてのデータ変数に独自の関数と静的変数が必要な場合に、大量のデータを処理してすべてを追跡するのは面倒です。

これを行うための最良の方法は何ですか?

4

1 に答える 1

0

救助のためのタスク!

public static Task<List<Usernames>> my_function()
{
    var tcs = new TaskCompletionSource<List<Usernames>>(); //pay attention to this line

    PostClient conn = new PostClient(POST);
    conn.DownloadStringCompleted += (object sender2, DownloadStringCompletedEventArgs z) =>
    {
        if (z.Error == null)
        {
            //Process result
            string data = z.Result;
            //MessageBox.Show(z.Result);  

            //Convert Login value to true false
            try
            {
                ///... do stuff here

                tcs.SetResult(null); //pay attention to this line
            }
            finally
            {
            }
        }
        else
        {
             //pay attention to this line
            tcs.SetException(new Exception());//todo put in real exception
        }
    };

    return tcs.Task; //pay attention to this line
}

//pay attention to this line既存のコードから追加した数行のコードを強調するために、いくつかのコメントを残しました。

C#5.0を使用awaitしている場合は、関数を呼び出すときに結果を確認できます。ブロッキング待機を実行することが許容されるコンテキストにいる場合はResult、返されたタスクをすぐに使用するか(特定の環境で実行する場合は注意してください)、返されたタスクの継続を使用して結果を処理することができます(これはawait舞台裏で何をするかです)。

于 2012-11-28T21:37:54.530 に答える