7

我们有一个名为 StatusUpdateHub 的 SignalR 集线器。此集线器由名为 HubClient 的 .NET 客户端更新。该客户端将(在生产中)被多个用户每秒调用大约 1000 次,用于不同的事务。这是客户端代码:

public static class HubClient
{
    private static readonly string statusUpdateUrl = ConfigurationManager.AppSettings["StatusUpdateUrl"];
    private static readonly HubConnection connection = new HubConnection(statusUpdateUrl);
    private static readonly IHubProxy hub = connection.CreateProxy("StatusUpdateHub");

    internal static void UpdateBrowser(long transactionId)
    {
        connection.Start().ContinueWith(task => hub.Invoke("UpdateTransactionStatus", transactionId)).ContinueWith(task =>
        {
            if (task.IsFaulted && task.Exception != null)
            {
                // log error
            }
        });
    }
}

当使用 100 个并发用户调用此代码时,它工作正常,但是当我们将并发用户数增加到 250 时,我们会看到以下错误:

UpdateBrowser 中出现意外错误:System.InvalidOperationException:尚未建立连接。在 SignalR.Client.Connection.SignalR.Client.IConnection.Send[T](String data) 在 SignalR.Client.Hubs.HubProxy.Invoke[T](String method, Object[] args) 在 SignalR.Client.Hubs。 HubProxy.Invoke(String method, Object[] args) at Application.Services.HubClient.<>c_DisplayClass2.b _0 (Task task1) in c:\Build\Work\Application\Services\HubClient.cs:line 20
at System .Threading.Tasks.Task`1.InvokeFuture(Object futureAsObj)
在 System.Threading.Tasks.Task.Execute()

让我们知道如何使代码更具可扩展性?

4

2 回答 2

10

如果这是每秒调用 1000 次的方法,那么您不应该connection.Start()每次都调用。

只打开一次连接,然后调用它的方法。

编辑,我的意思是,至少,让你的代码做这样的事情:

internal static void UpdateBrowser(long transactionId)
{
    lock (connection) 
    {
        if (connection.State == ConnectionState.Disconnected){
            connection.Start().Wait();
        }
    }
    hub.Invoke("UpdateTransactionStatus", transactionId).ContinueWith(task =>
    {
        if (task.IsFaulted && task.Exception != null)
        {
            // log error
        }
    });
}
于 2012-07-25T16:56:15.610 回答
5

默认情况下,.NET 允许从客户端应用程序传出 2 个并发连接,从 ASP.NET 应用程序传出 10 个并发连接。如果要增加此数字,请将http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx设置为更大的数字。看看是否有帮助。

于 2012-07-25T20:56:27.637 回答