C#试图在后台工作人员显示用户交互形式时暂停主线程

问题描述 投票:0回答:1

[我正在制作(尝试)一个类似于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; }
    }
}

有什么办法可以使这项工作?

基督

c# backgroundworker semaphore windowsformshost
1个回答
0
投票

听起来像您想要制作“模态形式”。

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

这将“停止” UI,直到您取消(或关闭)表单。

© www.soinside.com 2019 - 2024. All rights reserved.