簡體   English   中英

SignalR Hub 拋出 NRE

[英]SignalR Hub throws NRE

我有空引用異常的問題,無法理解為什么會發生這種情況。 這是我的樞紐

public class UserHub : Hub
    {
        private static List<Connection> Users = new List<Connection>();

        public override async Task OnConnected()
        {
            string id = Context.ConnectionId;
            string userName = Context.User.Identity.Name;

            if (Users == null)
                Users = new List<Connection>();

            if (!Users.ToArray().Any(_ => _.UserName == userName))
                Clients.AllExcept(Context.ConnectionId).onNewUserConnected(id, userName);

            if (!Users.ToArray().Any(x => x.ConnectionId == Context.ConnectionId))
                Users.Add(new Connection { ConnectionId = id, UserName = userName });

            Clients.Caller.onConnected(id, userName, Users.DistinctBy(_ => _.UserName).ToList());

            await base.OnConnected();
        }


        public override async Task OnReconnected()
        {
            string id = Context.ConnectionId;
            string userName = Context.User.Identity.Name;

            if (Users == null)
                Users = new List<Connection>();

            if (!Users.Any(_ => _.UserName == userName))
                Clients.AllExcept(Context.ConnectionId).onNewUserConnected(id, userName);

            if (!Users.Any(x => x.ConnectionId == id))
                Users.Add(new Connection { ConnectionId = id, UserName = userName });

            Clients.Caller.onConnected(id, userName, Users.DistinctBy(_ => _.UserName).ToList());

            await base.OnReconnected();
        }

        public override async Task OnDisconnected(bool stopCalled)
        {
            if (Users == null)
                Users = new List<Connection>();

            var item = Users.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);
            if (item != null)
                Users.Remove(item);


            Clients.All.onUserDisconnected(Context.ConnectionId, item.UserName);

            await base.OnDisconnected(stopCalled);
        }
    }

問題發生在 onConnected 方法中,在這一行:

if (!Users.ToArray().Any(_ => _.UserName == userName))

我試圖在上面添加 null 檢查,但它不起作用。 怎么了? 問題隨機出現。

堆棧跟蹤:

at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate)
   at App.Web.Hubs.UserHub.<OnConnected>d__1.MoveNext() in E:\Company\App\App\Presentation\App.Web\Hubs\UserHub.cs:line 49
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
...

您的代碼不是線程安全的,因此您可以在訪問Users列表時看到各種問題。 多個連接可以同時啟動或關閉,並且它們都訪問靜態Users屬性。 訪問列表時考慮使用並發數據結構或鎖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM