SignalR은 값을 반환하는 클라이언트 메소드를 가질 수 없습니다. 그래서 이것을 가능하게하는 도우미 클래스를 만들려고 노력하고 있습니다.은 SignalR로 클라이언트 측 메소드를 동 기적으로 호출합니다.
- 서버 측 :
그래서 이것은 내가 뭘하려고 오전입니다 고유의 요청 ID를 클라이언트 메소드를 호출하고 제공
Client(clientId).GetValue(requestId)
- 서버 측 : RequestID가를 저장하고
ManualResetEvent
- 클라이언트를 사용하여 응답을 기다립니다 쪽 : 내부
void GetValue(Guid requestId)
콜 서버 방식hubProxy.Invoke("GetValueFinished", requestId, 10)
- 서버 쪽 : 요청 대기 방법 찾기 아이디 => 설정 반환 값 => 신호 설정
- 서버 쪽 : 더 이상 기다리지 않는 방법
ManualResetEvent
및 검색된 값을 반환합니다.
불행히도 작업 할 수 있습니다. 나는이 방법 서버 측이 필요합니다이 MethodHandler
클래스를 사용
public static class MethodHandler
{
private static ConcurrentDictionary<Guid, ReturnWaiter> runningMethodWaiters = new ConcurrentDictionary<Guid,ReturnWaiter>();
public static TResult GetValue<TResult>(Action<Guid> requestValue)
{
Guid key = Guid.NewGuid();
ReturnWaiter returnWaiter = new ReturnWaiter(key);
runningMethodWaiters.TryAdd(key, returnWaiter);
requestValue.Invoke(key);
returnWaiter.Signal.WaitOne();
return (TResult)returnWaiter.Value;
}
public static void GetValueResult(Guid key, object value)
{
ReturnWaiter waiter;
if (runningMethodWaiters.TryRemove(key, out waiter))
{
waiter.Value = value;
}
}
}
internal class ReturnWaiter
{
private ManualResetEvent _signal = new ManualResetEvent(false);
public ManualResetEvent Signal { get { return _signal; } }
public Guid Key {get; private set;}
public ReturnWaiter(Guid key)
{
Key = key;
}
private object _value;
public object Value
{
get { return _value; }
set
{
_value = value;
Signal.Set();
}
}
}
: 여기 내 코드입니다
// Method registration
_hubProxy.On("GetValue", new Action<Guid>(GetValue));
public void GetValue(Guid requestId)
{
int result = 10;
_hubConnection.Invoke("GetValueResult", requestId, result);
}
문제 :
public int GetValue(string clientId)
{
return MethodHandler.GetValue<int>(key => Clients(clientId).Client.GetValue(key));
}
public void GetValueResult(Guid key, object value)
{
MethodHandler.GetValueResult(key, value);
}
클라이언트 측 구현이 같다 서버 측 GetValue("clientid")
을 호출하면
입니다. 클라이언트 메소드는 호출되지 않습니다. returnWaiter.Signal.WaitOne();
을 주석 처리하면 클라이언트 측 GetValue
이 호출되고 서버 측 GetValueResult
이 호출됩니다. 그러나 이번에도 방법은 이미 돌아왔다.
저는 ManualResetEvent
과 관련이 있다고 생각하지만 while(!returnWaiter.HasValue) Thread.Sleep(100);
을 사용해도이 문제는 해결되지 않습니다.
이 아이디어를 해결하는 방법에 대한 아이디어가 있으십니까?
미리 감사드립니다.
감사 :
그래서 나는 코드를 변경했습니다. 여러 대의 서버로 확장 할 필요는 없지만 성능은 아주 좋아야합니다. – hwcverwe'MethodHandler :: Retrieve'를'MethodHandler :: GetValue'로 변경했습니다 ;-) – hwcverwe