2016-04-11 4 views
-1

parallel.invokeで呼び出された場合にオブジェクト参照されない問題があります。問題は、メソッドを1つずつ呼び出すと動作することです。並列呼び出しメソッドで参照されていないオブジェクトエラー

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; 
     } 

彼らは定期的に動作するので、私はそれらを呼び出す場合:

 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; 

だから私の問題は、並行して呼び出した場合にのみ発生し、印刷されたエラーコードは次のとおりです。{ "オブジェクト参照のインスタンスに設定されていませんオブジェクト」}

どのように解決できますか?

+0

コールスタックを取り除くことのほかに、 'try ... catch ... throw'のポイントは何ですか? –

+0

ポイントがstoreProcedure.insertPastMeetingsにあります –

+0

タスク2はすでに何かがApplicationContext.Instance.pastmeetingListに設定されていると仮定しているようですが、これが正当なアクションのように思われない場合は、パラレルで実行している場合はタスク2が起動します妥当と思われる – BugFinder

答えて

0

最初のスレッドプールタスクではApplicationContext.Instance.pastmeetingList、2番目のスレッドプールタスクではApplicationContext.Instance.pastmeetingListと設定しています。両方を同時に実行することで、変数を同時に読み書きするようにコードに指示します。うまくいけば、読み込みが書き込みの前に行われていれば、これが機能しないことは明らかです。

したがって、このコードは並列化できません。

関連する問題