2017-12-13 14 views
0

(저는 Signalrr을 처음 사용합니다)허브 한 번만 실행 방법

Signalr-core를 사용하여 실시간으로 페이지를 업데이트하는 웹 응용 프로그램을 개발하고 있습니다.

내가 걸어야 할 문제는 내가 여러 클라이언트를 실행할 때 클라이언트가 있기 때문에 한 번에 여러 번 실행되는 방법을 실행한다는 것입니다.

그래서 첫 번째 클라이언트가 허브 메소드를 호출 한 다음 계속 실행하고 연결된 모든 클라이언트에 브로드 캐스팅하는 방법이 있는지 알고 싶습니다.

내가 내 클라이언트와 뭘하는지입니다 :

connection.on('update', (id, Color) => { 
var x = document.getElementById(id); 
if (Color === "green" && x.classList.contains("red")) 
{    
    //console.log("green"); 
    x.classList.remove("red"); 
    x.classList.add("green"); 
}    
else if (Color === "red" && x.classList.contains("green")) 
{    
    //console.log("Red"); 
    x.classList.remove("green"); 
    x.classList.add("red"); 
}}); 

connection.start() 
.then(() => connection.invoke('updateclient', updating)); 

를이 내가 내 허브 뭘하는지입니다 :

public void UpdateClient(bool updating)//this must run only once 
    { 
     while (updating == true) 
     { 
      Thread.Sleep(2000); 
      foreach (var item in _context.Devices) 
      { 

       IPHostEntry hostEntry = Dns.GetHostEntry(item.DeviceName); 
       IPAddress[] ips = hostEntry.AddressList; 
       foreach (IPAddress Ip in ips) 
       { 
        Ping MyPing = new Ping(); 

        PingReply reply = MyPing.Send(Ip, 500); 
        if (reply.Status == IPStatus.Success) 
        { 
         Color = "green"; 
         Clients.All.InvokeAsync("update", item.DeviceID, Color); 

         break; 
        } 
        else 
        { 
         Color = "red"; 
         Clients.All.InvokeAsync("update", item.DeviceID, Color); 
        } 
       } 

      } 

     } 
    } 

내가 불분명 해요 있으면 알려 주시기 바랍니다 어떤것에 대해.

및 사전에 감사드립니다.

+1

단순히 클라이언트에서 'updateclient'를 호출하지 마십시오. ** 처음 클라이언트 컨텍스트에 클라이언트가 나타날 때마다 서버 코드를 다시 디자인하여'updateclient' 메소드를 실행할 수 있습니다. – ibubi

+0

와우 덕분에 많이 –

+0

그 아이디어를 어떻게 끌어낼 수 있을까요? @ibubi –

답변

1

주석에서 언급 한 것처럼 클라이언트의 첫 번째 모양에서 UpdateClient 메서드를 호출 할 수 있습니다. 내가 생각해 낸 옵션은 다음과 같습니다.

quite common가 OnConnected를 오버라이드 (override), 허브에서 허브

public static class UserHandler 
{ 
    public static List<string> UserList = new List<string>(); 
} 

에 연결된 클라이언트에 대한 정적 목록을 사용과 방법을 OnDisconnected/목록에서 클라이언트를 추가/제거하고 연결된 첫 번째 클라이언트를 정의하는 것입니다 귀하의 목적에 맞는 허브.

public class MyHub : Hub 
{ 
    private static IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 

    public override Task OnConnected() 
    {  
     //Here check the list if this is going to be our first client and if so call your method, next time because our list is filled your method won't be invoked. 
     if(UserHandler.UserList.Count==0) 
      UpdateClient(true); 

     UserHandler.UserList.Add(Context.ConnectionId)  
     return base.OnConnected(); 
    } 
    public override Task OnDisconnected(bool stopCalled) 
    { 
     UserHandler.UserList.RemoveAll(u => u.ConnectionId == Context.ConnectionId); 
     return base.OnDisconnected(stopCalled); 
    } 
} 

비즈니스 로직이나 필요를 고려하지 않았지만 이것은 일반적인 아이디어 일뿐입니다. 예를 들어 모든 클라이언트가 꺼지면 일부 논리를 추가 할 수 있습니다. 업데이트 플래그를 사용하여 UpdateClient 내부에서 루프를 중지해야합니다.