0

Я разрабатываю приложение Windows Phone 8 с помощью Windows Azure Mobile Services.Недопустимый сквозной доступ Windows Azure

У меня есть следующий код:

private async void appBarButton1_Click(object sender, EventArgs e) 
    { 
     var table = App.MobileService.GetTable<ChatRoomOverview.chatrooms>(); 
     //TODO 
     List<ChatRoomOverview.chatrooms> ChatRooms = await table.Where(chat => chat.chatroomName == ChatroomName.Text).ToListAsync(); 
     if (ChatRooms.Count() < 1) 
     { 
      ChatRoomOverview.chatrooms ChatRoom = new ChatRoomOverview.chatrooms { chatroomName = ChatroomName.Text, Created = DateTime.Today.Date.ToString(), content = ChatRoomOverview.userName + "|:::|" + FirstPost.Text + "|::|::|", LastPost = FirstPost.Text + "|::|::|", tag1 = tag1.Text, tag2 = tag2.Text, tag3 = tag3.Text, isPrivate = isPrivateCheck.IsChecked.Value, userName = ChatRoomOverview.userName, Popular = "0" }; 

      await table.InsertAsync(ChatRoom); 
      long tempID =ChatRoom.Id; 
      await subscripeToNewChatRoom(tempID); 

      NavigationService.Navigate(new Uri("/ChatRoomOverview.xaml", UriKind.Relative)); 
     } 
     else 
     { 
      MessageBox.Show("This Chatroom is allready created go to Search and check it out :)", "Chatroom Exists!", MessageBoxButton.OK); 
     } 
    } 

выше код excuted когда пользователь хочет создать комнату. Здесь все работает. Но в моей новой итерации приложения я хочу реализовать pushnotification, и поэтому я хочу использовать таблицу подписок. Это введено в функции subscripeToNewChatRoom. Его переменной является выданный идентификатор для чата, указанный при вставке элемента чата. Это значение существует и является правильным.

private System.Threading.Tasks.Task subscripeToNewChatRoom(long tempID) 
    { 
     ChatRoomOverview.Subscription Subscription = new ChatRoomOverview.Subscription { ContentID = Convert.ToInt32(tempID), userId = App.UserInfromationID }; 
     **ERROR** App.MobileService.GetTable<ChatRoomOverview.Subscription>().InsertAsync(Subscription); 
     return null; 
    } 

Приведенный выше код затем предлагается для вставки подписки. Этот код работает с другими местами в коде, поэтому я не понимаю, что такое ошибка. Но ошибка возникает там, где я написал ошибку в коде. Полное исключение находится в нижней части вопроса.

Так что я не понимаю, почему я понимаю, почему я получаю недопустимый сквозной доступ?

Дополнительный Хорошо, поэтому на основе ответа и комментариев Jaihind я придумал код ниже. И теперь я могу видеть, что таблицы, с которыми я взаимодействую, получают правильные данные. Бууут, я все еще получаю исключение.

private async void bwSubscription_DoWork(object sender, DoWorkEventArgs e) 
    { 
     List<object> genericlist = e.Argument as List<object>; 

     var table = await App.MobileService.GetTable<ChatRoomOverview.chatrooms>(); 
     //List<ChatRoomOverview.chatrooms> ChatRooms = table.Where(chat => chat.chatroomName == ChatroomName.Text) 

     //table.InsertAsync(ChatRoom); 
     ChatRoomOverview.chatrooms chat = (ChatRoomOverview.chatrooms)genericlist[0]; 
     //var ChatRoom = table.Where(chatting => chatting.chatroomName == chat.chatroomName).ToListAsync(); 

     long tempID = chat.Id; 

     ChatRoomOverview.Subscription Subscription = new ChatRoomOverview.Subscription { ContentID = tempID, userId = App.UserInfromationID }; 
     await App.MobileService.GetTable<ChatRoomOverview.Subscription>().InsertAsync(Subscription); 
    } 

Но при вставке TRY/поймать, чтобы обработать исключение, которое не произойдет, то элемент не будет вставлен в лазурном таблице.

Рабочий раствор

private async void bwSubscription_DoWork(object sender, DoWorkEventArgs e) 
    { 
     bool subscriped = false; 
     List<object> genericlist = e.Argument as List<object>; 

     var table = App.MobileService.GetTable<ChatRoomOverview.chatrooms>(); 
     //List<ChatRoomOverview.chatrooms> ChatRooms = table.Where(chat => chat.chatroomName == ChatroomName.Text) 

     //table.InsertAsync(ChatRoom); 
     ChatRoomOverview.chatrooms chat = (ChatRoomOverview.chatrooms)genericlist[0]; 
     //var ChatRoom = table.Where(chatting => chatting.chatroomName == chat.chatroomName).ToListAsync(); 

     long tempID = chat.Id; 
     while (!subscriped) 
     { 
      try 
      { 
       ChatRoomOverview.Subscription Subscription = new ChatRoomOverview.Subscription { ContentID = tempID, userId = App.UserInfromationID , Notifications = 0}; 
       await App.MobileService.GetTable<ChatRoomOverview.Subscription>().InsertAsync(Subscription); 
      } 
      catch 
      { 

      } 
      List<ChatRoomOverview.Subscription> subscript = await App.MobileService.GetTable<ChatRoomOverview.Subscription>().Where(subs => subs.ContentID == tempID && subs.userId == App.UserInfromationID && subs.Notifications == 0).ToListAsync(); 
      if (subscript.Count > 0) 
      { 
       ChatRoomOverview.userName = ""; 
       subscriped = true; 
      } 
      else 
      { 
       subscriped = false; 
      } 
     } 

    } 

Мой Exception в полном

  • $ исключение {System.UnauthorizedAccessException: Invalid доступа кросс-нить. в MS.Internal.XcpImports.CheckThread() в MS.Internal.XcpImports.MessageBox_ShowCore (String messageBoxText, Строка заголовка, типа UInt32) в System.Windows.MessageBox.ShowCore (String messageBoxText, Струнный подпись, кнопка MessageBoxButton) на System.Windows.MessageBox.Show (String messageBoxText) в ChatRoom.App.CurrentChannel_ShellToastNotificationReceived (Object отправителя, NotificationEventArgs е) в Microsoft.Phone.Notification.ShellObjectChannelInternals.OnNotificationReceived (IntPtr сгустка, UInt32 blobSize) в Microsoft.Phone. Notification.ShellObjectChannelInternals.ChannelHandler (UInt32 eventType, IntPtr blob1, UInt32 blobSize1, IntPtr blob2, UInt32 blobSize2) в Microsoft.Phone.Notification.HttpNotificationChannel.Dispatch (Object thr eadContext) в System.Threading.QueueUserWorkItemCallback.WaitCallback_Context (состояние объекта) на System.Threading.ExecutionContext.RunInternal (ExecutionContext ExecutionContext, ContextCallback обратного вызова, объект состояния, логическое preserveSyncCtx) на System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, ContextCallback обратного вызова, состояние объекта, логическое preserveSyncCtx) на System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() на System.Threading.ThreadPoolWorkQueue.Dispatch() в System.Threading._ThreadPoolWaitCallback.PerformWaitCallback)} системы (.Exception {System.UnauthorizedAccessException}
+0

Я не понимаю, что это имеет отношение к Azure. Столбец в исключении явно указывает, что фоновому потоку было предложено показать окно сообщения. Отображение окна сообщения должно выполняться из потока графического интерфейса пользователя. –

ответ

0

Рабочий раствор

private async void bwSubscription_DoWork(object sender, DoWorkEventArgs e) 
{ 
    bool subscriped = false; 
    List<object> genericlist = e.Argument as List<object>; 

    var table = App.MobileService.GetTable<ChatRoomOverview.chatrooms>(); 
    //List<ChatRoomOverview.chatrooms> ChatRooms = table.Where(chat => chat.chatroomName == ChatroomName.Text) 

    //table.InsertAsync(ChatRoom); 
    ChatRoomOverview.chatrooms chat = (ChatRoomOverview.chatrooms)genericlist[0]; 
    //var ChatRoom = table.Where(chatting => chatting.chatroomName == chat.chatroomName).ToListAsync(); 

    long tempID = chat.Id; 
    while (!subscriped) 
    { 
     try 
     { 
      ChatRoomOverview.Subscription Subscription = new ChatRoomOverview.Subscription { ContentID = tempID, userId = App.UserInfromationID , Notifications = 0}; 
      await App.MobileService.GetTable<ChatRoomOverview.Subscription>().InsertAsync(Subscription); 
     } 
     catch 
     { 

     } 
     List<ChatRoomOverview.Subscription> subscript = await App.MobileService.GetTable<ChatRoomOverview.Subscription>().Where(subs => subs.ContentID == tempID && subs.userId == App.UserInfromationID && subs.Notifications == 0).ToListAsync(); 
     if (subscript.Count > 0) 
     { 
      ChatRoomOverview.userName = ""; 
      subscriped = true; 
     } 
     else 
     { 
      subscriped = false; 
     } 
    } 

} 
0

Это поможет вам.

private subscripeToNewChatRoom(long tempID) 
      { 
       ChatRoomOverview.Subscription Subscription = new ChatRoomOverview.Subscription { ContentID = Convert.ToInt32(tempID), userId = App.UserInfromationID }; 
     Dispatcher.BeginInvoke(() => 
         { 
     App.MobileService.GetTable<ChatRoomOverview.Subscription>().InsertAsync(Subscription); 
         }); 

       return null; 
      } 
+0

К сожалению, я все еще получаю сообщение об ошибке, я прочитал об этом решении, но понял, что это касается проблем с пользовательским интерфейсом? Я попробовал, но не решил проблему. – JTIM

+0

@JTIM использовать диспетчер в appBarButton1_Click. – Jaihind

+0

Я выполнил функцию subscripeToNewChatRoom. И переместил код в событие appBarButton1_Click, произошла одна и та же ошибка:/ – JTIM

0

Не пытайтесь отображать элементы пользовательского интерфейса от фонового потока. Стек вызовов ясно указывает, что это то, что вы пытались сделать.

QueueUserWorkItem означает, что это столбец из фоновой нити. Затем мы видим, что вызывается MessageBox.Show(). Это приведет к тому же исключению в настольном приложении или в приложении без какого-либо контакта с лазурной.

Смежные вопросы