【问题标题】:Async await in mvvm silverlight 4mvvm silverlight 4中的异步等待
【发布时间】:2012-10-24 09:03:55
【问题描述】:

在我的 silverlight mvvm 应用程序中,我使用 wcf 服务来填充需要时间加载的列表框,因此我需要使用 async 并在其中等待。我如何在下面的代码中使用它。

我在视图模型中的代码:

    private void GetLanguage()
    {
        ServiceAgent.GetLanguage((s, e) =>Language = e.Result);
    }

我在服务代理中的代码

    public void GetLanguage(EventHandler<languageCompletedEventArgs> callback)
    {
        _Proxy.languageCompleted += callback;
        _Proxy.languageAsync();
    }

谁能帮帮我

【问题讨论】:

    标签: wcf silverlight mvvm silverlight-4.0 async-await


    【解决方案1】:

    您必须使用 TaskCompletionSource 将 EAP(事件异步模型)转换为 TAP(任务异步模型)。首先,向您的 ServiceAgent 添加新方法(您甚至可以将其创建为扩展方法):

    public Task<string> GetLanguageAsync(EventHandler<languageCompletedEventArgs> callback)
    {
        var tcs = new TaskCompletionSource<string>();
        EventHandler<languageCompletedEventArgs> callback;
        callback = (sender, e) =>
        {
            _Proxy.languageCompleted -= callback;
            tcs.TrySetResult(e.Result);
        };
    
        _Proxy.languageCompleted += callback;
        _Proxy.languageAsync();
    
        return tcs.Task;
    }
    

    TCS 将创建一个您可以等待的任务。通过使用现有模型,它将弥合差距并使其可与 async/await 一起使用。您现在可以在视图模型中使用它:

    private void GetLanguage()
    {
        Language = await ServiceAgent.GetLanguageAsync();
    }
    

    【讨论】:

      【解决方案2】:

      您可以通过使用此库:AsyncTargetingPack 在 Silverlight 5(或 .NET 4)中实现使用 async 和 await。 AsyncTargetingPack 位于NuGet

      如需完整的演练,请阅读这篇优秀的文章:

      Using async and await in Silverlight 5 and .NET 4 in Visual Studio 11 with the async targeting pack

      【讨论】:

        猜你喜欢
        • 2016-12-07
        • 1970-01-01
        • 1970-01-01
        • 2015-04-09
        • 1970-01-01
        • 1970-01-01
        • 2021-10-22
        • 1970-01-01
        • 2018-05-12
        相关资源
        最近更新 更多