C# - 异步回调 - WP7 - Silverlight - 存储数据

时间:2012-11-28 21:13:49

标签: c# silverlight windows-phone-7 asynchronous callback

我有一个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;
}

目前,我正在使用回调函数来更新触发事件的静态变量,并且使用大量数据并跟踪所有数据是一种麻烦,尤其是当每个数据变量都需要自己的函数和静态变量时。

这是最好的方法吗?

1 个答案:

答案 0 :(得分: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)。