【问题标题】:Async WCF Call in mono stucks in endless loop单声道中的异步 WCF 调用陷入无限循环
【发布时间】:2014-06-12 10:00:19
【问题描述】:

我在 MonoAndroid 调用 WCF 服务异步时遇到问题。 我按照本教程创建了便携式类库。 http://nullskull.com/a/10476775/xamarin-cross-platform-application-consuming-wcf--part-1.aspx

这是我调用 WCF 服务的服务方法:

public async static Task<KeyExchangeModel> GetPublicKeyFromServer(KeyExchangeModel model)
{
    try
    {
        ISyncService client;
        client = new SyncServiceClient(_binding, _endpointAddress);

        var res = Task<KeyExchangeModel>.Factory.FromAsync(client.BeginGetServerPublicKey, client.EndGetServerPublicKey,
                model, null);
        await res;
        return res.Result;
    }
    catch (Exception e)
    {
        return null;
    }   
}

我在这里调用方法并等待它执行。

Task<KeyExchangeModel> task = SyncServiceAgent.GetPublicKeyFromServer(keyModel);
task.Wait();
KeyExchangeModel serverModel = task.Result;

问题是在 Android 上我从来没有得到结果。它卡在一个循环中。设备日志中没有记录或抛出异常。

此代码完美适用于 Windows 单元测试和 Windows Phone 项目。

希望有人能帮助我。

非常感谢。

【问题讨论】:

    标签: c# mono xamarin xamarin.android


    【解决方案1】:

    您的问题是这里的这一行:task.Wait(); 阻塞异步代码会导致死锁。

    默认情况下,await 将捕获当前的“上下文”,并使用该上下文来恢复 async 方法。在这种情况下,它可能正在捕获绑定到 UI 线程的 UI 上下文。因此,GetPublicKeyFromServer 将启动 WCF 调用,捕获 UI 上下文,并返回一个不完整的任务。然后调用代码在该任务上调用Task.Wait,这阻塞 UI 线程,直到该异步方法完成。

    稍后,WCF 调用返回,GetPublicKeyFromServer 尝试在同一上下文中恢复(在 UI 线程上)。但是,UI 线程被阻止等待GetPublicKeyFromServer 完成。这是典型的死锁情况。

    它在单元测试中起作用的原因是因为async 方法捕获线程池上下文而不是UI 上下文,因此它能够阻塞Wait 中的一个线程池线程和另一个 线程池线程可以完成async 方法。通常,Windows Phone 应用程序的 UI 上下文问题与 Android 应用程序相同,因此我怀疑测试代码存在一些不同,这就是它在 WP 上没有死锁的原因。

    我更详细地描述了这个问题on my blogin an MSDN articlein my book

    解决此问题的最佳方法是使用await 而不是Task.WaitTask&lt;T&gt;.Result。即,您的调用代码应该是:

    Task<KeyExchangeModel> task = SyncServiceAgent.GetPublicKeyFromServer(keyModel);
    KeyExchangeModel serverModel = await task;
    

    这将要求您的调用代码为async,这反过来又要求调用者为async,等等。通过代码库的这种异步“增长”是自然而正常的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 2013-03-17
      相关资源
      最近更新 更多