我的中心有方法
public class auctionHub : Hub
{
public static bool loop = true;
public auctionHub()
{
}
public void init(object auctions)
{
loop = true;
while (loop)
{
List<Auction> auctionList = new JavaScriptSerializer().Deserialize<List<Auction>>(auctions.ToString());
var auctionsToClient = auctionList.Select(m => new { m.Id, EndDate = ExtensionMethods.ToReadableTimeSpanString(m.EndDate - DateTime.Now) });
context.Clients.Client(Context.ConnectionId).serverTime(DateTime.Now.ToLongTimeString(), auctionsToClient);
Thread.Sleep(1000);
}
}
public void setLoop(bool val)
{
loop = val;
}
}
在View中我有javascript方法:
$('body').on('click', '#AuctionList .pagination a', function (event) {
event.preventDefault();
var url = $(this).attr('href');
$.ajax({
url: url,
success: function (result) {
//ChangeUrl('index', url);
//auctionHub.server.stop();
$('#AuctionList').html(result);
auctionHub.server.init(newData);
}
});
});
在控制器中
public ActionResult Index(int? page,FormCollection form)
{
//other code
if (Request.IsAjaxRequest())
{
//auctionHub.loop = false;
DefaultHubManager hd = new DefaultHubManager(GlobalHost.DependencyResolver);
var hub = hd.ResolveHub("auctionHub") as auctionHub;
if (hub != null)
{
hub.setLoop(false);
}
}
//other code
}
我有问题,因为当一个用户在控制器中调用方法索引并使用hub方法hub.setLoop(false)和break循环时,有时这也会打破其他用户的循环。我建立了实时拍卖系统。我不知道如何修理它。
答案 0 :(得分:0)
因为你的问题是循环布尔值。你不应该在这里使用静态变量。我不明白你想要做什么,但考虑这样做。
为每个用户创建一个包含循环bool的字典。字典的关键是connectionid(如果你不知道如何获取它,请查看signalR文档)。对于来自同一用户的所有呼叫,connectionid将保持相同。字典的值将是一个布尔值(表示循环变量)。
由于您有多个线程,因此使用字典需要了解如何使用字典保证线程安全。你可以使用concurrentdictionary来帮助。检查:MSDN link和此example
字典对象使其成为静态变量。然后在你的函数中,在你获得或设置循环变量的任何地方,你应该从字典中获取值,并将其设置回字典。如果连接ID不存在则表示这是该用户的第一次调用,因此您应该使用循环默认值将其添加到字典中。
很抱歉没有发布代码,我希望解释得足够好。