在asp.net mvc控制器中使用signalR类方法

时间:2016-09-04 15:15:20

标签: asp.net-mvc signalr

我的中心有方法

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循环时,有时这也会打破其他用户的循环。我建立了实时拍卖系统。我不知道如何修理它。

1 个答案:

答案 0 :(得分:0)

因为你的问题是循环布尔值。你不应该在这里使用静态变量。我不明白你想要做什么,但考虑这样做。

为每个用户创建一个包含循环bool的字典。字典的关键是connectionid(如果你不知道如何获取它,请查看signalR文档)。对于来自同一用户的所有呼叫,connectionid将保持相同。字典的值将是一个布尔值(表示循环变量)。

由于您有多个线程,因此使用字典需要了解如何使用字典保证线程安全。你可以使用concurrentdictionary来帮助。检查:MSDN link和此example

字典对象使其成为静态变量。然后在你的函数中,在你获得或设置循环变量的任何地方,你应该从字典中获取值,并将其设置回字典。如果连接ID不存在则表示这是该用户的第一次调用,因此您应该使用循环默认值将其添加到字典中。

很抱歉没有发布代码,我希望解释得足够好。