繁体   English   中英

试图在后台工作人员在 C# 中显示用户交互表单时停止主线程

[英]Trying to stall main-thread while background worker displays a user-interactive form in C#

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

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

听起来你想制作一个“模态形式”。

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

这将“停止”用户界面,直到您取消(或以其他方式关闭)表单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM