连接时WP8 SignalR客户端挂起

时间:2013-11-27 20:44:50

标签: windows-phone-8 signalr portable-class-library

我正在使用http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-getting-started-with-signalr-20的示例作为我的中心。对于我的客户,我使用的是针对Xamarin.Android和WP8(Profile158)的PCL,并添加了Nuget的SignalR .NET客户端。

然后我从Xamarin.Android和WP8项目中引用PCL。

他们都只是根据示例发送和接收聊天消息。

作为服务器中心项目和Xamarin.Android应用程序一部分的Web客户端都可以正常工作。但是,WP8应用程序挂起hubConnection.Start().Wait()

所有客户端和集线器都在同一个WiFi网络上,两部电话都可以访问网页客户端。

我正在使用SignalR服务器和.NET客户端的2.0.0.0版本。

两个设备客户端使用的PCL客户端使用以下代码:

public class ChatClient
{
    private IHubProxy _chatHubProxy = null;

    public string Connect(Action<string, string> chatCallback)
    {
        var hubConnection = new HubConnection("http://192.168.0.4/SignalRSpike");
        hubConnection.Error += hubConnection_Error;
        hubConnection.Headers.Add("Id", "1");

        _chatHubProxy = hubConnection.CreateHubProxy("ChatHub");
        _chatHubProxy.On<string, string>("broadcastMessage", chatCallback);
        hubConnection.Start().Wait();
        return hubConnection.Transport.Name;
    }

    void hubConnection_Error(Exception ex)
    {
        Debug.WriteLine("Hub error: " + ex.ToString());
    }

    public async void SendMessage(string name, string message)
    {
        var result = await _chatHubProxy.Invoke<bool>("Send", name, message);
        Debug.WriteLine("Result of send: " + result);
    }
}

集线器代码是:

public class ChatHub : Hub
{

    public async Task<bool> Send(string name, string message)
    {
        // Call the broadcastMessage method to update clients.
        await Clients.All.broadcastMessage(name, message);
        return true;
    }
}

“输出调试”窗口显示

'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'Anonymously Hosted DynamicMethods Assembly'. 
'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\Data\Programs\{34D909A2-97D5-4735-85F6-4B735F6C6769}\Install\System.Net.Http.DLL'. Cannot find or open the PDB file.
'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\windows\system32\System.Threading.Tasks.ni.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\Data\Programs\{34D909A2-97D5-4735-85F6-4B735F6C6769}\Install\System.Net.Http.Primitives.DLL'. Cannot find or open the PDB file.
'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Loaded 'C:\Data\Programs\{34D909A2-97D5-4735-85F6-4B735F6C6769}\Install\System.Net.Http.Extensions.DLL'. Cannot find or open the PDB file.
The thread 0x2b3c has exited with code 259 (0x103).
The thread 0x32a0 has exited with code 259 (0x103).
The thread 0x1f80 has exited with code 259 (0x103).

当应用挂起时,每隔一分钟就会出现一个新的thread x has exited

更新1

我正在使用IIS并且应用程序池已集成。

我还将客户端代码从PCL复制到WP8应用程序中,以便不再依赖PCL程序集,但结果完全相同。

1 个答案:

答案 0 :(得分:4)

因此,虽然一些教程示例显示正在执行Start().Wait(),但这通常是一个坏主意,因为它会阻止当前线程。在这种情况下,它是UI线程。我的猜测是Start()也想使用UI线程(至少在WP8上),所以我们遇到了死锁。将上述内容更改为使用await代替Wait()可以解决问题。