2016-06-03 5 views
0

FormA와 formB의 두 가지 폼이있는 Windows 응용 프로그램이 있습니다. formB 그대로작업자 스레드 : 하위 폼이 작업자 스레드에서 활성화되었을 때 상위 폼 비활성화

포르은 상기 작업자 스레드 지금

private void pdBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    var _verifyID = new frmFormB();     
    _verifyID.ShowDialog(); 
    if (!_verifyID.blnVerified) 
    { 
    return; 
    } 
    else { //do something } 
} 

다음과 같이 FormB 표시되어야 메소드를 호출

private void cmdGet_Click(object sender, EventArgs e) 
    { 
      if (pdBackgroundWorker.IsBusy == false) 
      { 
       pdBackgroundWorker.RunWorkerAsync(); 
      } 
    } 

다음 클릭하면이 작업자 스레드를 시작 버튼 btnGet 포함 작업자 스레드에서 표시되는 경우 formB을 표시하기 위해 ShowDialog 메서드를 사용했지만 해당 부모 FormA는 여전히 활성 상태입니다.

FormB이 활성화되면 FormA는 액세스를 위해 제한되어야하며 ShowDialog은 스레드가없는 경우에도 작동해야합니다.

+1

그 형태는 작업자 스레드에 있으면 안됩니다. 백그라운드 작업을 시작하기 전에 확인을하십시오. – LarsTech

답변

0

SynchronizationContext를 사용하려고합니다.

여기에 예가 나와 있습니다. MSDN

SynchronizationContext에 클래스

public partial class Form1 : Form 
{ 
    BackgroundWorker _backgroundWorker; 

    public Form1() 
    { 
     InitializeComponent(); 
     var worker = new Worker(SynchronizationContext.Current); 
     _backgroundWorker = new BackgroundWorker(); 
     _backgroundWorker.DoWork += (sender, e) => worker.DoWork(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (_backgroundWorker.IsBusy == false) 
     { 
      _backgroundWorker.RunWorkerAsync(); 
     } 
    } 
} 

public class Worker 
{ 
    private readonly SynchronizationContext _synchronizationContext; 

    private Form2 form2; 

    public Worker(SynchronizationContext synchronizationContext) 
    { 
     _synchronizationContext = synchronizationContext; 
     form2 = new Form2(); 
    } 

    public void DoWork() 
    { 
     _synchronizationContext.Send(callback => OpenForm(), null); 
    } 

    public void OpenForm() 
    { 
     form2.ShowDialog(); 

     if (!form2.blnVerified) 
     { 
      return; 
     } 
     else 
     { 
      //do something 
     } 
    } 
} 

없이 동기화 자유 스레드 컨텍스트를 제공하는베이스 클래스이다. 이 클래스에서 구현하는 동기화 모델의 목적은 공용 언어 런타임의 내부 비동기/동기 작업이 다른 동기화 모델에서 올바르게 작동 할 수 있도록하기위한 것입니다. 또한이 모델은 여러 동기화 환경에서 제대로 작동하기 위해 관리되는 응용 프로그램이 따라야하는 요구 사항을 단순화합니다. 동기화 모델의 공급자는이 클래스를 확장하여 이러한 메서드에 대한 고유 한 구현을 제공 할 수 있습니다.

희망이 도움이 :)