我有一个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;
}
目前,我正在使用回调函数来更新触发事件的静态变量,并且使用大量数据并跟踪所有数据是一种麻烦,尤其是当每个数据变量都需要自己的函数和静态变量时。
这是最好的方法吗?
答案 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
)。