1

在我的 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();
    }

谁能帮我

4

2 回答 2

4

You must use TaskCompletionSource to convert EAP (event asynchronous model) to TAP (task asynchronous model). First, add new method to your ServiceAgent (you can create this even as an extension method):

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 will create a task which you can await then. By using the existing model, it will bridge the gap and make it consumable with async/await. You can now consume it in the view model:

private void GetLanguage()
{
    Language = await ServiceAgent.GetLanguageAsync();
}
于 2012-11-04T11:24:58.953 回答
0

您可以使用以下库在Silverlight 5 (或 .NET 4)中使用 async 和 await :AsyncTargetingPack。AsyncTargetingPack 在NuGet上。

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

在带有异步目标包的 Visual Studio 11 中使用 Silverlight 5 和 .NET 4 中的 async 和 await

于 2012-11-04T08:12:18.337 回答