2016-04-11 4 views
-1

Ich habe ein Problem nicht referenzierte Objekt, wenn mit parallel.invoke aufgerufen wird, das Problem ist, dass, wenn Sie sie eins nach dem anderen die Methoden aufrufen, sie arbeiten.Unreferenced Objekt Fehler mit parallelen Aufruf Methode

try 
     { 
      Task t1 = Task.Run(async() => 
      { 
       log.Info("call GetRecentHomeChanges"); 
       GetRecentHomeChanges resultHomeChanges = await apManager.GetRecentHomeChanges(ApplicationContext.Instance.LoggedUser.UserName, ApplicationContext.Instance.LoggedUser.HashedPwd); 
       ApplicationContext.Instance.pastmeetingList = resultHomeChanges.PastMeetings; 
       ApplicationContext.Instance.documentsHomePageList = resultHomeChanges.Attachments; 
      }); 
      Task t2 = Task.Run(() => 
      { 
       //STORE PROCEDURE CALL - INSERISCO I PAST MEETINGS 
       storeProcedure.insertPastMeetings(ApplicationContext.Instance.LoggedUser.PID, ApplicationContext.Instance.pastmeetingList); 
       List<PastMeetings> pastMeetingsDB = storeProcedure.selectPastMeetings(ApplicationContext.Instance.LoggedUser.PID); 
       ApplicationContext.Instance.pastmeetingList = pastMeetingsDB; 
      }); 

      await Task.WhenAll(t1, t2); 
     } 
     catch(Exception ex) 
     { 
      throw ex; 
     } 

, wenn ich sie so nennen sie regelmäßig arbeiten:

 log.Info("call GetRecentHomeChanges"); 
     GetRecentHomeChanges resultHomeChanges = await apManager.GetRecentHomeChanges(ApplicationContext.Instance.LoggedUser.UserName, ApplicationContext.Instance.LoggedUser.HashedPwd); 
     ApplicationContext.Instance.pastmeetingList = resultHomeChanges.PastMeetings; 
     ApplicationContext.Instance.documentsHomePageList = resultHomeChanges.Attachments; 

     //STORE PROCEDURE CALL - INSERISCO I PAST MEETINGS 
     storeProcedure.insertPastMeetings(ApplicationContext.Instance.LoggedUser.PID, ApplicationContext.Instance.pastmeetingList); 
     List<PastMeetings> pastMeetingsDB = storeProcedure.selectPastMeetings(ApplicationContext.Instance.LoggedUser.PID); 
     ApplicationContext.Instance.pastmeetingList = pastMeetingsDB; 

Also nur mein Problem tritt auf, wenn parallel Aufruf, und die gedruckte Fehlercode ist: { "Objektverweis nicht auf eine Instanz eingestellt ein Objekt. "}

Wie kann ich lösen?

+0

Was ist der Sinn dieses 'Try ... catch ... throw' neben dem Aufruf des Call-Stacks? –

+0

der Punkt ist auf der storeProcedure.insertPastMeetings –

+0

Task 2 scheint anzunehmen, dass bereits ApplicationContext.Instance.pastmeetingList gesetzt ist. Wenn dies nicht der Fall ist, scheint dies eine gültige Aktion zu sein - wenn Sie parallel laufen, kann task2 ausgelöst werden und nichts hat sich darauf eingestellt, wenn es beginnt .. Scheint vernünftig – BugFinder

Antwort

0

Sie setzen ApplicationContext.Instance.pastmeetingList in der ersten Threadpoolaufgabe und lesen ApplicationContext.Instance.pastmeetingList in der zweiten Threadpoolaufgabe. Indem Sie beide parallel ausführen, sagen Sie Ihrem Code, die Variable gleichzeitig zu lesen und zu schreiben. Hoffentlich ist es offensichtlich, dass dies nicht funktioniert, wenn das Lesen vor dem Schreiben stattfindet.

Also, dieser Code kann nicht parallelisiert werden.