2012-04-10 3 views
2

멀티 스레딩 및 이벤트에 몇 가지 문제가 있습니다.멀티 스레딩 및 이벤트

내가 몇 스레드에서 실행 다음과 같은 기능이 있습니다 : 그것은 다음과 같이 호출된다

private void GetProjectInformation(object obj) 
{ 
    //Casten 
    //string projectName = (string)obj; 
    FilterOptions filter = (FilterOptions)obj; 

    ProjectConnectionManager connectionManager = new ProjectConnectionManager(); 
    connectionManager.GetProjectInfo(filter); 
    connectionManager.InfoReceived += delegate(object sender, ProjectInfoEventArgs e) 
    { 
     //Geupdate resultaat in de collection vervangen 
     int index = 0; 
     bool found = false; 
     m_dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => 
     { 
      foreach (ProjectInfo projectInfo in m_allProjects) 
      { 
       if (String.Equals(projectInfo.ProjectName, e.ProjectInfo.ProjectName)) 
       { 
        found = true; 
        ProjectInfo result = e.ProjectInfo; 
        m_allProjects[index] = e.ProjectInfo; 

        break; 
       } 
       index++; 
      } 

      //Niet gevonden 
      if (!found) 
      { 
       m_allProjects.Add(e.ProjectInfo); 
      } 
     })); 
    }; 
} 

:

foreach (FilterOptions opt in m_projectsToShow) 
{ 
    Thread thread = 
       new Thread(new ParameterizedThreadStart(GetProjectInformation)); 
    thread.Start(opt); 
} 

나는 (내가 생각하는)에 직면 오전 문제입니다

connectionManager.GetProjectInfo(filter); 

내 스레드가 취소됩니다. 작업이 종료되었다는 AggregateException이 발생합니다. 그래서 이것이 문제가되어야합니다. 내가 성취하고자하는 것은 다음과 같습니다. 이에 대한 해결책은

connectionManager.InfoReceived += ... 

있습니까 : 내 기능은, 현재의 thread 때문에, 그 이벤트가 발생 될 때까지 차단할 수있다? 제발 좀 줄래?

편집 :

이것은 GetProjectInfo 방법입니다 :

public void GetProjectInfo(FilterOptions filter) 
    { 
     ProjectInfo result = new ProjectInfo(); 

     try 
     { 
      var task = m_httpClient.PostAsync(string.Format("api/project"), new ObjectContent<FilterOptions>(filter, XmlMediaTypeFormatter.DefaultMediaType)); 
      task.ContinueWith(r => 
      { 
       try 
       { 
        r.Wait(); 
        if (r.Result.IsSuccessStatusCode) 
        { 
         Console.WriteLine("Project " + filter.ProjectName + " was succesfull..."); 

         r.Result.Content.ReadAsAsync<ProjectInfo>().ContinueWith(l => 
         { 
          result = l.Result; 
          OnProjectInfoReceived(new ProjectInfoEventArgs(result)); 
         }); 
        } 
        else 
        { 
         Console.WriteLine("Project " + filter.ProjectName + " failed!"); 
        } 
       } 
       catch (AggregateException ex) 
       { 
        Console.WriteLine(ex.ToString()); 
       } 
      }).Wait(m_httpClient.Timeout); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
    } 

가 그리고 내가 거기에 AggregateException를 얻을.

는 예외입니다 :

System.AggregateException was caught 
    Message=One or more errors occurred. 
    Source=mscorlib 
    StackTrace: 
     at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) 
     at System.Threading.Tasks.Task`1.get_Result() 
     at Dashboard.Utils.ProjectConnectionManager.<>c__DisplayClass8.<GetProjectInfo>b__5(Task`1 r) in C:\Users\xxx\Documents\My Own Documents\xxx\ProjectConnectionManager.cs:line 79 
    InnerException: System.Threading.Tasks.TaskCanceledException 
     Message=A task was canceled. 
     InnerException: 
+0

'm_allProjects' 더 잘 스레드 안전 수집해야한다 : 이벤트 핸들러가 실행될 때까지 어쨌든

, 당신은 ManualResetEvent 사용할 수있는 스레드를 차단합니다. –

+0

'GetProjectInfo()'가 어떻게 든 다른 스레드를 시작합니까? 그렇지 않으면 먼저 이벤트를 연결해야합니다. –

+0

감사합니다 헨크, 나도 그걸 봐야 겠어. 하지만 먼저 내 주요 문제에 대한 해결책을 갖고 싶습니다. –

답변

1

AggregateExceptionsTasks에 의해 발생되지만 Threads를 사용하는 ??

private void GetProjectInformation(object obj) 
{ 
    ... 
    ProjectConnectionManager connectionManager = new ProjectConnectionManager(); 

    var mre = new ManualResetEvent(false); 

    connectionManager.InfoReceived += delegate(...) 
    { 
     ... 
     mre.Set(); 
    }; 

    connectionManager.GetProjectInfo(filter); 

    mre.WaitOne(); 
} 
+0

이 솔루션을 시도했지만 작동하지 않습니다. 그 밖의 무엇이 그때 틀릴 수 있 었는가? –

+0

다른 사람이 있습니까? –

+0

어쨌든 .Continue를 1 행에 넣고 처음에했던 것처럼 새 줄에 넣지 않아도 문제를 해결할 수있었습니다. 아주 이상한 상황. 어쨌든 당신을 감사하십시오 !! –