如何从另一个类的事件处理程序获取结果?

时间:2014-05-06 10:47:33

标签: c# windows-phone

我必须从Web服务获得结果。这是我用过的:

编辑:

private void Button_Click(object sender, RoutedEventArgs e)
    {
        webService.WebServiceHuscSoapClient a = new webService.WebServiceHuscSoapClient();
        a.InsertNewUserCompleted += a_InsertNewUserCompleted;
        a.InsertNewUserAsync("name", "phonenumber", "address");
    }

    void a_InsertNewUserCompleted(object sender, webService.InsertNewUserCompletedEventArgs e)
    {
        MessageBox.Show(e.Result.ToString());
    }

有什么方法可以将所有这些功能甚至处理程序都放到一个类中,当我想从我的webservice获取数据时,我会做这样的事情:

string json = MyWebService.GetData();

2 个答案:

答案 0 :(得分:1)

首先,您对DownloadStringAsync的调用建议传递用户名和密码,但它不会那样工作。 Check the documentation

To(不是真的:-))回答你的问题:现在更好的办法就是使用新的' async / await' C#5中提供的功能。有关全面概述,请参阅this link

然后你的例子变得微不足道(不再需要连接一个单独的事件处理程序)

private async void Button_Click(object sender, RoutedEventArgs e)
{
    WebClient webclient = new WebClient();
    // TODO set up credentials
    string result = await webclient.DownloadStringTaskAsync("http://your-url-here");
    textBlock1.Text = str;
}

然后,您仍然可以在单独的,可重用的(异步)方法中提取它:

private async Task<string> GetDataAsync()
{
    WebClient webClient = new WebClient();
    // TODO set up credentials
    string result = await webclient.DownloadStringTaskAsync("http://your-url-here"); 
    return result;
}

如果你想坚持使用基于事件的方法,你可以将功能包装在一个单独的类中,并且它自己的事件,但这不会给你带来很多收益IMO。

答案 1 :(得分:0)

我从这篇文章中找到了它:How to use async-await with WCF in VS 2010 for WP7?

更多:Async CTP - How can I use async/await to call a wcf service?

我在另一堂课上写了这篇文章:

 public static Task<int> InsertNewUser(string name, string phonenumber,string address) //can make it an extension method if you want.
    {
        TaskCompletionSource<int> tcs = new TaskCompletionSource<int>();
        service.InsertNewUserCompleted += (object sender, WebService.InsertNewUserCompletedEventArgs e) => //change parameter list to fit the event's delegate
        {
            if (e.Error != null) tcs.SetResult(-1);
            else
                tcs.SetResult((int)e.Result);
        };
        service.InsertNewUserAsync(name, phonenumber,address);
        return tcs.Task;
    }

然后我可以从我的班级调用它:

 int su = await WebServiceHelper.SignUp("blabla", "0123465","huehuehue");