我正在建立一个服务器 - 客户端应用程序来实时控制服务器信号技术。
我想要从客户端获取对象列表,等待返回值,查看示例:
服务器
List<Site> Sites = (List<Site>)Clients.Caller.GetSiteList();
客户端:
void GetSiteList()
{
_triggerHubProxy.Invoke<int>("SetSiteList", new List<SIte>);
}
像ajax请求 - 请求 - &gt;等待返回 - 响应。
我怎么做?
感谢您的关注! :)
答案 0 :(得分:0)
http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-net-client
var stocks = await stockTickerHub.Invoke<IEnumerable<Stock>>("AddStock", new Stock() { Symbol = "MSFT" });
foreach (Stock stock in stocks)
{
textBox.Text += string.Format("Symbol: {0} price: {1}\n", stock.Symbol, stock.Price);
}
Invoke方法异步执行并返回Task对象。 如果未指定await或.Wait(),则下一行代码将为 在您调用的方法执行完毕之前执行。
这应该有效:P
答案 1 :(得分:0)
客户端上的方法应如下所示:
async Task GetSiteList()
{
await _triggerHubProxy.Invoke<int>("SetSiteList", new List<Site>());
}
并且应该通过调用它的方法等待。如果要返回值,则需要将方法更改为以下内容:
async Task<int> GetSiteList()
{
return await _triggerHubProxy.Invoke<int>("SetSiteList", new List<Site>());
}
答案 2 :(得分:0)
使用SignalR无法从客户端方法获取服务器上的返回值。相反,您应该将站点列表从客户端传递到服务器作为参数。所以这个:
public void MyServerHubMethod()
{
// The following line will throw an InvalidCastException since
// Client methods cannot return values to the server.
List<Site> sites = (List<Site>)Clients.Caller.GetSiteList();
DoSomethingWithSites(sites);
}
成为这个:
public void MyServerHubMethod(List<Site> sites)
{
DoSomethingWithSites(sites);
}
可以这样调用:
List<Site> sites = GetSites();
await _triggerHubProxy.Invoke("MyServerHubMethod", sites);