Попытка остановить основной поток, пока фоновый работник отображает интерактивную форму пользователя в C # - PullRequest
0 голосов
/ 11 декабря 2019

Я пытаюсь (пытаюсь) создать диалоговое окно, похожее на диалог openFileDialogue, в котором поток программ основного потока останавливается до тех пор, пока функция OPF.ShowDialogue() не остановится при запуске отдельного потока.

У меня естьOpenFileDialogue_Gui класс, который использует семафор и фоновый рабочий.

Фоновый рабочий сначала запускается для генерации отдельной формы с необходимым пользовательским интерфейсом

Затем семафор останавливает основной потокпока пользователь не нажмет одну из кнопок в форме фонового потока.

Затем он освобождает семафор и результат отправляется обратно в вызывающую функцию.

Звучит неплохо в теории, но естьпроблема. Фоновый рабочий не отображает свою форму и не работает.

Вот код:

public class openfiledialogue_Gui
{
    Semaphore semStall = new Semaphore(0, 1);
    BackgroundWorker bck = new BackgroundWorker();

    public openfiledialogue_Gui()
    {
        bck.WorkerSupportsCancellation = true;
        bck.DoWork += Bck_DoWork;
        bck.RunWorkerCompleted += Bck_RunWorkerCompleted;
    }

    public enum enuResult { Ok, Cancel, _num };
    public enuResult ShowDialogue()
    {
        bck.RunWorkerAsync();
        semStall.WaitOne();
        return eResult;
    }

    enuResult eResult = enuResult.Cancel;

    void EventOk_click(object sender, EventArgs e)
        {
            eResult = enuResult.Ok;
            strFilename = "ok clicked";
            semStall.Release();
        }

    void EventCancel_click(object sender, EventArgs e)
        {
            eResult = enuResult.Cancel;
            strFilename = "cancel clicked";
            semStall.Release();
        }

    private void Bck_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){semStall.Release();}

    private void Bck_DoWork(object sender, DoWorkEventArgs e)
    {
        Form frmShow = new Form();
        Button btnOk = new Button();
        btnOk.Text = "ok";

        Button btnCancel = new Button();
        btnCancel.Text = "Cancel";

        btnOk.AutoSize
            = btnCancel.AutoSize
            = true;

        frmShow.Controls.Add(btnOk);
        frmShow.Controls.Add(btnCancel);

        frmShow.ControlBox = false;

        btnOk.Location = new Point(100, 25);
        btnCancel.Location = new Point(100, 75);

        btnCancel.Click += EventCancel_click;
        btnOk.Click += EventOk_click;
        frmShow.Show();

    }

    public string strFilename = "this is a test";
    public string Filename
    { 
    get { return strFilename; }
    }
}

Есть ли способ заставить эту работу работать?

1 Ответ

0 голосов
/ 12 декабря 2019

Звучит так, будто вы хотите создать «модальную форму».

var form = new MyModalForm();
form.ShowDialog();

Это будет «останавливать» интерфейс, пока вы не отмените (или не закроете иным образом) форму.

...