2010-05-31 2 views

답변

3

FolderBrowserDialog를 포함한 모든 셸 대화 상자에는 스레드를 STA로 설정하기위한 COM 아파트가 필요합니다. 당신은 아마 Thread.SetApartmentState() 호출을 누락 :

private void button1_Click(object sender, EventArgs e) { 
     var t = new Thread(() => new FolderBrowserDialog().ShowDialog()); 
     t.IsBackground = true; 
     t.SetApartmentState(ApartmentState.STA); 
     t.Start(); 
    } 

당신이 대화의 소유자를 설정할 수 없음을주의, 그것은 쉽게 다른 응용 프로그램의 창 뒤에 분실. 따라서 작업자 스레드에 폼이나 대화 상자를 표시하는 것이 좋지 않습니다.

+0

위대한 .. 내가 이런 식으로 할 수 있습니다 : 예외가 작업자 스레드에서 발생하는 경우 1. 추가 프로세스 즉 스레드 2를 중지하십시오. 주 스레드에 예외가 발생했음을 알리는 주 스레드를 알립니다 3. 메인 스레드에서 FolderBrowserDialog를 호출합니다. ?? 그렇다면 plz이 어떻게 할 수 있는지에 대한 힌트를주세요. – Manish

+0

예외가 발생할 때 입력 대화 상자를 표시 하시겠습니까? 그것은 아주 현명하지 못합니다. 사용자가 대화의 의미를 알게 될 때까지, 그녀는 예외를 야기하기 위해 무엇을했는지 완전히 잊어 버릴 것입니다. 로그 파일을 저장하려면 AppData 폴더를 사용하십시오. –

2

난 당신이 원하는 이유를 잘 모르겠습니다 취소 확인 이 작업을 수행. 작업자 스레드에서 계산에 필요한 모든 값을 사용할 수 있어야합니다. 더 많은 입력을 얻기 위해서는 사용자 상호 작용이 필요하지 않습니다.
아마도 재 설계가 도움이 될 수 있습니다. 선택한 폴더를 시작하기 전에 작업자 스레드에 제공하는 방법에 대해 생각해보십시오.

EDIT (주석에 응답) : 당신이 어떤 로그인 내 대답을하려면
여전히 적용됩니다. 작업자 스레드는 예외를 기록 할 위치를 알아야하며 사용자에게 질문하지 않아야합니다.
로깅 프레임 워크를 사용합니까? 그렇지 않다면 예를 들어 log4net을보십시오. 여기서 일반적으로 XML 파일의 로깅 (로그 수준, 경로, 형식 등)을 미리 구성합니다. 사용자 상호 작용이 필요 없습니다. 사용자가 로깅 경로를 변경할 수는 있지만 (xml 파일에서).

+0

나는 작업자 스레드 프로세스에서 예외를 기록하고 싶습니다.이 때문에 사용자의 폴더 경로를 취해야합니다. – Manish

+0

그게 내가하고 싶지 않은 것입니다 : 하드 코딩! 사용자에게 폴더를 지정하고 거기에 예외를 텍스트 파일에 기록 할 권한을 부여하고 싶습니다. 네, 로깅 프레임 워크를 사용합니다. – Manish

+0

@Manish :하지만 XML 파일에 쓰는 것은 어렵지 않습니다 ... 쉽게 변경할 수 있습니다. 당신은 프로그램의 옵션에 경로를 제공 할 수도 있습니다 ... – tanascius

관련 문제