멀티 스레딩 및 이벤트에 몇 가지 문제가 있습니다.멀티 스레딩 및 이벤트
내가 몇 스레드에서 실행 다음과 같은 기능이 있습니다 : 그것은 다음과 같이 호출된다
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:
'm_allProjects' 더 잘 스레드 안전 수집해야한다 : 이벤트 핸들러가 실행될 때까지 어쨌든
, 당신은ManualResetEvent
사용할 수있는 스레드를 차단합니다. –'GetProjectInfo()'가 어떻게 든 다른 스레드를 시작합니까? 그렇지 않으면 먼저 이벤트를 연결해야합니다. –
감사합니다 헨크, 나도 그걸 봐야 겠어. 하지만 먼저 내 주요 문제에 대한 해결책을 갖고 싶습니다. –