[我正在制作(尝试)一个类似于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();
这将“停止” UI,直到您取消(或关闭)表单。