2016-06-03 4 views
0

Ich habe Windows-Anwendung mit zwei Formularen FormA und FormB.Worker Thread: Deaktivieren des übergeordneten Formulars, wenn untergeordnete Formular in einem Worker-Thread aktiv ist

FormA enthält eine Schaltfläche btnGet die, wenn sie angeklickt einen Arbeiter-Thread beginnt wie folgt

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

Die obige Arbeitsthread eine Methode ruft die FormB anzeigen soll wie folgt

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

Jetzt, da formB ist angezeigt von Worker-Thread, seine Eltern FormA wird weiterhin aktiv sein, obwohl ich ShowDialog Methode verwendet, um formB anzuzeigen.

Gibt es eine bessere Möglichkeit, dies zu handhaben, so dass, wenn FormB aktiv ist, FormA für den Zugriff eingeschränkt werden sollte, wie ShowDialog funktioniert für Non-Thread-Fälle?

+1

Diese Formen nicht in der Worker-Thread sein sollte. Holen Sie sich die Bestätigung, bevor Sie mit der Hintergrundarbeit beginnen. – LarsTech

Antwort

0

wollen Sie SynchronizationContext verwenden

hier ein Beispiel.

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 
     } 
    } 
} 

von Msdn

Die SynchronizationContext Klasse ist eine Basisklasse, die einen freethreaded Kontext ohne Synchronisation zur Verfügung stellt. Der Zweck des von dieser Klasse implementierten Synchronisationsmodells besteht darin, den internen asynchronen/synchronen Operationen der Common Language Runtime zu ermöglichen, sich mit verschiedenen Synchronisationsmodellen ordnungsgemäß zu verhalten. Dieses Modell vereinfacht auch einige der Anforderungen, die verwaltete Anwendungen erfüllen mussten, damit sie in verschiedenen Synchronisationsumgebungen ordnungsgemäß funktionieren. Anbieter von Synchronisationsmodellen können diese Klasse erweitern und eigene Implementierungen für diese Methoden bereitstellen.

hoffe, das hilft :)

Verwandte Themen