我有使用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
和事件:
Quastions :
如何从回调方法中获取数据?
GetCompanyInfoAsync
和Begin\End
之间有什么区别?
最佳实践:如何异步执行方法,以便我的WPF应用程序的GUI不会冻结?
答案 0 :(得分:3)
我假设你正在使用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的更多信息。
答案 1 :(得分:0)
您可以使用.net 4的异步CTP,它将成为.net中的一部分。
它在C#中添加了两个新的关键字async和await关键字
使用async关键字标记方法或lamda并返回a
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;
}
答案 2 :(得分:0)
使用TPL:
Task t = TaskFactory.FromAsync(
beginMethod: BeginGetCompanyInfo,
endMethod: EndGetCompanyInfo,
arg1: session,
state: null);
t.ContinueWith(result =>
{
// handle result
});