我必须从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();
答案 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");