2011-03-04 1 views
3

응용 프로그램이 아무런 오류없이 종료되고 VS가 열렸습니다. FileSystemWatchers을 동적으로 여러 개 생성했습니다. 모두 "생성됨"이벤트에 이벤트 핸들러가 있습니다. 그래서이 이벤트 핸들러 방법은 다음과 같습니다 : 프로그램이 종료되지VS2010에서 실행하면 애플리케이션이 닫히기 만합니다 (오류 또는 오류 없음)

void watcher_FileCreated(object sender, FileSystemEventArgs e) 
{ 
    FileInfo f1 = new FileInfo(e.FullPath); 
    filesDataGrid.Rows.Add(f1.Name); 
    foreach (TLPclass table in parameterForm.getParameters) 
    { 
     //uses some funcion form another class 
    } 
} 

라인은 내가 DataGridView - filesDataGrid.Rows.Add(f1.Name); 에 파일 이름을 추가하고있어 하나 또한 그 선없이 확인을 실행합니다. 이상한 것은 프로젝트 폴더의 .exe 파일에서 시작될 때 응용 프로그램이 정상적으로 실행된다는 것입니다. 내 코드에서 오류를 볼 수는 없지만 오류 메시지가 표시되지 않으면 오류가있는 것으로 생각됩니다. 그리고 프로그램이 경고없이 종료 될 수있는 가장 일반적인 이유는 무엇입니까?

답변

2

예 :. 이벤트 처리기 내부의 논리는이 사실을 고려하여 필요한 모든 동기화를 수행해야합니다. 내가 시도 - 캐치했는데, 나는 "그것은이 작성된보다 유효한 filesDataGrid 다른 스레드에서 accesed없는 크로스 스레드 작업!"있어요 -

private void watcher_FileCreated(object sender, FileSystemEventArgs e) 
{ 
    if (filesDataGrid.InvokeRequired) 
    { 
     filesDataGrid.Invoke((MethodInvoker)delegate { watcher_FileCreated(sender, e); }); 
    } 
    else 
    { 
     FileInfo f1 = new FileInfo(e.FullPath); 
     filesDataGrid.Rows.Add(f1.Name); 
     foreach (TLPclass table in parameterForm.getParameters) 
     { 
      //uses some funcion form another class 
     } 
    } 
} 
+0

고마워요 - 그건 크로스 스레드 오류를 설명합니다. 하지만 어떻게 든 eventhandler 메서드 내에서 테이블을 업데이트 할 수 있습니까? – andree

+0

@andree - 예제를 참조하십시오. 업데이트하려면 GUI 스레드로 다시 호출해야합니다. – SwDevMan81

+0

이것은 효과가 있습니다. 더 나은 이해를 위해 "Invoke"메소드를 점검해야합니다. – andree

0

try {} catch (Exception ex) {} 블록으로 함수를 래핑하십시오. 나는 DataGridRow가 먼저 FileSystemWatcher의 변수로 생성되어야하기 때문이라고 생각합니다.

FileSystemWatcher는 별도의 스레드에서 이벤트를 트리거 할

DataGridViewRow row = filesDataGrid.NewRow(); 

row["columnname"] = f1.name; 

filesDataGrid.Rows.Add(row); 
+0

감사 : 그래서 당신이 뭔가를해야합니다. 이제 나는 함께 할 무언가를 얻었습니다. 그러나 같은 클래스에서 생성 되었기 때문에 크로스 스레드 인 이유를 이해하지 못합니다. 코드에서 새 스레드가 생성되지 않기 때문입니다. – andree

+0

일반적으로 변경 사항을 보려고하는 것과 동일한 시간대에 DataGrid를 업데이트하려고한다는 것을 의미합니다. 그래서 나는 UpdateDataGrid와 같은 또 다른 Event Handler를 greate하여 매개 변수를 전달합니다. fl.Name이 anothe thred에 있다고 추측합니다. 그래서 직접 컨트롤을 직접 업데이트 할 수 없습니다. Winforms를 사용하고 있습니까? 또는 WPF? 기타..? –

+1

그것은 Winforms입니다. DataGrid에 정보를 추가하기 위해 eventhandler를 사용할 것입니다. 내가해야한다고 생각한다. – andree

관련 문제