C# 信号机连接和#x27;Don’不要在一个单独的班级里开始

C# 信号机连接和#x27;Don’不要在一个单独的班级里开始,c#,singleton,signalr,C#,Singleton,Signalr,我已经在一个singleton类中设置了信号器连接,这样我就可以在整个项目中使用相同的连接。问题是,连接从未启动,代码也从未在wait hubConnection.Start()行之外执行。但是,当我在单个类之外执行此操作时,连接会立即启动。我不知道我做错了什么。 以下是我对singleton类的定义: public sealed class ProxySubscriber { private static volatile ProxySubscriber instance; p

我已经在一个singleton类中设置了信号器连接,这样我就可以在整个项目中使用相同的连接。问题是,连接从未启动,代码也从未在
wait hubConnection.Start()行之外执行。但是,当我在单个类之外执行此操作时,连接会立即启动。我不知道我做错了什么。
以下是我对singleton类的定义:

public sealed class ProxySubscriber
{
    private static volatile ProxySubscriber instance;
    private static object syncRoot = new Object();
    private IHubProxy chatHubProxy = null;
    private HubConnection hubConnection = null;
    public event Action<string, string> OnConnect;
    private ProxySubscriber()
    {
        if (hubConnection == null) { hubConnection = new HubConnection("http://cforbeginners.com:901"); }
        if (chatHubProxy == null) { chatHubProxy = hubConnection.CreateHubProxy("ChatHub"); }

        chatHubProxy.On<string, string>("onConnected", (id, username) => OnConnect.Invoke(id, username));
    }

    private async Task<string> StartConnection()
    {
        await hubConnection.Start();

        return "Connection started..";
    }

    public async void InvokeConnect()
    {
        await chatHubProxy.Invoke("Connect", "Mujtaba");
    }
    public static async Task<ProxySubscriber> GetInstance()
    {
        if (instance == null)
        {
            lock (syncRoot)
            {
                if (instance == null)
                {
                    instance = new ProxySubscriber();

                }
            }
        }

        await instance.StartConnection();
        return instance;
    }
}

首先,不要使GetInstance()异步。使用它只是创建一个没有更多逻辑的实例

StartConnection
设为公用,并从外部呼叫,等待呼叫:

await ProxySubscriber.GetInstance().StartConnection();
ProxySubscriber.GetInstance().OnConnect += proxySubscriber_OnConnect;
ProxySubscriber.GetInstance().InvokeConnect();
如果需要从非异步方法运行此代码:

Task.Factory.StartNew(async () => {
    await ProxySubscriber.GetInstance().StartConnection();
    ProxySubscriber.GetInstance().OnConnect += proxySubscriber_OnConnect;
    ProxySubscriber.GetInstance().InvokeConnect();
});
更多详情:

  • 我觉得你们班的名字不对。最好是像
    signalClientHelper
    这样的东西
  • 您不需要检查构造函数上的null值,因为如果(hubConnection==null)为null,则它无疑将为null
  • 为什么在服务器上有“连接”方法?当您执行
    操作时,请等待hubConnection.Start()您已经在连接。如果您只想向连接分配用户名,则可以在调用Start()之前在标头中传递该用户名:
    hubConnection.Headers.Add(“username”,“Mujtaba”)
  • 如果您想使这个类可靠,您需要处理信号器断开连接(但这将是一个不同的问题)
  • 无论何时调用
    chatHubProxy.Invoke(“无论什么”)如果连接在某个点丢失,可能会出现异常,这将导致应用程序崩溃。语句并根据需要处理异常
  • StartConnection
    应检查是否已经存在连接。所以如果你打100次电话,它只会连接一次
  • 一般来说,您应该在连接丢失时学习并实现一些逻辑


    看一看,首先,不要使GetInstance()异步。使用它只是创建一个没有更多逻辑的实例

    StartConnection
    设为公用,并从外部呼叫,等待呼叫:

    await ProxySubscriber.GetInstance().StartConnection();
    ProxySubscriber.GetInstance().OnConnect += proxySubscriber_OnConnect;
    ProxySubscriber.GetInstance().InvokeConnect();
    
    如果需要从非异步方法运行此代码:

    Task.Factory.StartNew(async () => {
        await ProxySubscriber.GetInstance().StartConnection();
        ProxySubscriber.GetInstance().OnConnect += proxySubscriber_OnConnect;
        ProxySubscriber.GetInstance().InvokeConnect();
    });
    
    更多详情:

  • 我觉得你们班的名字不对。最好是像
    signalClientHelper
    这样的东西
  • 您不需要检查构造函数上的null值,因为如果(hubConnection==null)为null,则它无疑将为null
  • 为什么在服务器上有“连接”方法?当您执行
    操作时,请等待hubConnection.Start()您已经在连接。如果您只想向连接分配用户名,则可以在调用Start()之前在标头中传递该用户名:
    hubConnection.Headers.Add(“username”,“Mujtaba”)
  • 如果您想使这个类可靠,您需要处理信号器断开连接(但这将是一个不同的问题)
  • 无论何时调用
    chatHubProxy.Invoke(“无论什么”)如果连接在某个点丢失,可能会出现异常,这将导致应用程序崩溃。语句并根据需要处理异常
  • StartConnection
    应检查是否已经存在连接。所以如果你打100次电话,它只会连接一次
  • 一般来说,您应该在连接丢失时学习并实现一些逻辑


    看一看,很酷。我会做出这些改变,看看情况是否会好转。关于第6点,我如何检查是否已经存在连接?另外,我是否必须在我使用实例的每个片段中调用StartConnection()方法?我已经做了如上所述的更改,并且有效:)为了更好地理解signal.cool,我将花些时间阅读这些链接。我会做出这些改变,看看情况是否会好转。关于第6点,我如何检查是否已经存在连接?另外,我是否必须在我使用实例的每个片段中调用StartConnection()方法?我已经做了如上所述的更改,并且有效:)为了更好地理解Signal,我将花些时间从这些链接中读取。