[英]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.