2011-03-29 6 views
0

스레드에 문제가 있습니다. 내 코드 :이 형태는 타이머를 가지고 (iForm에서 사용자의 입력을받을 필요가 있기 때문에 내가 ShowDialog를 사용하고다른 스레드의 대화 상자 닫기

public String Parse(String url,CancellationToken ct) 
{ 
    ct.ThrowIfCancellationRequested(); 
    /* many lines of code */ 
    InputForm iForm = new InputForm(); 
    iForm.setPageData(pageData); 

    if (iForm.ShowDialog() == DialogResult.OK) 
    { 
     string userInput = iForm.textBox.Text; 
     /* code block */ 
     return result; 
    } else { 
     return Parse(newUrl,ct); 
    } 
} 

을 자동 60 초 후에 닫혀 : 구문 분석에서 지금

Task.Factory.StartNew(() => 
{ 
    cts = new CancellationTokenSource(); 
    var lines = File.ReadLines(Path.Combine(Environment.CurrentDirectory, "urls.txt")); 

    try 
    { 
     var q = from line in lines.AsParallel().WithDegreeOfParallelism(30).WithCancellation(cts.Token) 
     let result = Parse(line, cts.Token) 
      select new 
      { 
       res = result 
      }; 

     foreach (var x in q) 
     { 
      if (x != null) 
      { 
       Console.WriteLine("{0}", x.res); 
      } 
     } 

    } 
    catch (OperationCanceledException ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
}); 

내가 가진). 이제 약 30 개의 양식을 열고 취소 (기본 양식에서)를 클릭하면이 대화 상자 양식을 수동으로 닫아야합니다. 취소를 클릭하면이 양식을 닫을 수 있습니까?

+0

이것은 Windows Form 또는 WPF입니까? "문제"는 무엇입니까? – CodingGorilla

+0

Windows Form. 문제는 내가 열린 대화 상자를 자동으로 닫는 방법을 모른다는 것입니다. – JanZiolko

+0

나는'Close' 메서드를 호출하는 것으로 이해하고 있는지 잘 모르겠습니다. 네가 묻고있는거야? – CodingGorilla

답변

0

당신은 http://msdn.microsoft.com/en-us/library/system.windows.forms.application.openforms.aspx

열기 열린 형태의 반복과 가까운 타입 InputForm의있는 것들에 호출 할 수 있습니다보고 할 수는

는 편집 :

아래의 코멘트는이 것 맞습니다 예외를 throw합니다. 실제로 FormToClose.BeginInvoke (delegate() => FormToClose.Close())와 같은 것이 필요합니다.

+0

OP의 양식은 별도의 스레드로 작성됩니다. 주 스레드에서 닫으려고하면 크로스 스레드 또는 잘못된 연산 예외가 발생합니다. – jp2code

1

나는 이것을 많이한다.

당신이해야 할 겁니다 것은

  • 는 메인 스레드를 호출하고 응답
  • 에서 대기 실행의 자신의 메인 스레드 (MTOE)와 통신 할 수있는 방법을 만드는 것입니다 주 스레드는
  • 이 작업을 완료 스레드 신호 스레드에 대한 귀하의 대화 상자
  • 설정 반환 값을 표시

사용자 지정 이벤트 처리기는 스레드에서 MTOE로 메시지를 가져 오는 데 유용합니다.

ManualResetEvent은 스레드가 MTOE가 완료된 시점을 알기에 좋습니다.

클래스 인스턴스는 MTOE가 몇 가지 데이터 항목을 채우기 위해 사용하는 이벤트 핸들러에서 전달 될 수 있으며 완료 될 때마다 스레드로 다시 전달됩니다.

일반적으로 특수 클래스를 만들면 이벤트 처리기와 ManualResetEvent 개체가 포함됩니다.

MTOE에서 양식을 닫으면 대기중인 대화 상자를 모두 취소로 알릴 수 있습니다.

이것은 약간의 재 설계가 필요 하겠지만, 나는 그것이 당신에게 무엇을 줄 것이라고 생각합니다.

관련 문제