![](/img/trans.png)
[英]How to asynchronously consume a WCF Data Service using paging with BeginExecute in UWP
[英]How to get data (asynchronously) from WCF?
我有使用WCF的代码,从服务器请求数据。
例如:
public static Company LoadCompanyInfo(Guid session)
{
var client = new QualerServiceClient("QualerService");
return client.GetCompanyInfo(session);
}
我需要让我的wpf应用程序异步运行这些代码。
我尝试:
public static Company LoadCompanyInfoAsync(Guid session)
{
var client = new QualerServiceClient("QualerService");
client.BeginGetCompanyInfo(session, new AsyncCallback(EndLoadCompanyInfoAsync), client);
// How to Get Data from AsyncCallback function?
return null;
}
private static void EndLoadCompanyInfoAsync(IAsyncResult r)
{
var client = r.AsyncState as QualerServiceClient;
var result = client.EndGetCompanyInfo(r);
// how to return the result value ??
}
但我不知道如何从回调函数返回数据。
我有方法:
BeginGetCompanyInfo和EndGetCompanyInfo
GetCompanyInfoAsync
和事件:
规则 :
如何从回调方法中获取数据?
GetCompanyInfoAsync
和Begin\\End
什么区别?
最佳实践:如何异步执行方法,以便我的WPF应用程序的GUI不会冻结?
我假设你正在使用VS2012。
首先,如果您的目标是.NET 4.0,则安装(通过NuGet)Async Targeting包。 如果您的目标是.NET 4.5,则无需执行任何特殊操作。
接下来,重新创建客户端代理。 现有的Begin
/ End
/ Async
端点将替换为单个Task<Company> GetCompanyInfoAsync(Guid)
。
现在您可以像这样使用它:
public static Task<Company> LoadCompanyInfoAsync(Guid session)
{
var client = new QualerServiceClient("QualerService");
return client.GetCompanyInfoAsync(session);
}
public async void ButtonClickOrWhatever(...)
{
var company = await LoadCompanyInfoAsync(mySession);
// Update UI with company info.
}
旧的Begin
/ End
方法对使用异步编程模型(APM)。 旧的Async
/ event
对使用基于事件的异步编程模型(EAP)。 新的Async
方法使用基于任务的异步编程模型(TAP)。 我在博客上有关于async
WCF的更多信息。
您可以使用.net 4的异步CTP,它将成为.net中的一部分。
它在C#中添加了两个新的关键字async和await关键字。
使用async关键字标记方法或lamda并返回Task
或Task<T>
当你打电话给你的方法时,你会这样称呼它
var result = await LoadCompanyInfo(sessionId);
public static async Task<Company> LoadCompanyInfo(Guid session)
{
Company result = default(Company);
await TaskEx.Run(()=>{
var client = new QualerServiceClient("QualerService");
result = client.GetCompanyInfo(session);
});
return result;
}
使用TPL :
Task t = TaskFactory.FromAsync(
beginMethod: BeginGetCompanyInfo,
endMethod: EndGetCompanyInfo,
arg1: session,
state: null);
t.ContinueWith(result =>
{
// handle result
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.