Я пытаюсь (пытаюсь) создать диалоговое окно, похожее на диалог 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; }
}
}
Есть ли способ заставить эту работу работать?