2012-08-23 81 views
4

我得到了使用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

和事件:

  • GetCompanyInfoCompleted。

Quastions

  1. 我怎样才能从回调方法中的数据?

  2. GetCompanyInfoAsyncBegin\End有什么区别?

  3. 最佳实践:如何异步执行方法,以便我的WPF应用程序的GUI不会冻结?

+0

我们不知道QualerServiceClient从哪里来...... – franssu

+0

它有什么关系吗?我想知道,我如何从列表中的回调和其他类型的quastions中获取数据。 –

+0

因为你正在调用它的一个功能,所以它有点重要。如果您想了解AsycnCallbacks:http://stackoverflow.com/questions/1047662/what-is-asynccallback 在WPF中异步执行代码的最佳实践通常是使用后台工作程序。 – franssu

回答

0

你可以使用异步CTP为.NET 4,这将成为.NET的一部分在5

它增加了两个新的关键字到C#异步和等待关键字。
您标记与async关键字的方法或LAMDA并返回一个 TaskTask<T>

,当你打电话给你的方法,你能调用它像这样

var result = await LoadCompanyInfo(sessionId); 

Async CTP

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; 
    } 
+0

thans,但我使用.net 4.0没有异步CTP –

0

使用TPL

Task t = TaskFactory.FromAsync(
      beginMethod: BeginGetCompanyInfo, 
      endMethod: EndGetCompanyInfo, 
      arg1: session, 
      state: null); 
t.ContinueWith(result => 
    { 
     // handle result 
    }); 
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的更多信息。

+0

对不起,但我必须使用.net 4.0 –

+0

答案并不是说你不应该使用4.0。 –