[英]Closing a form that is created in another thread
我一直在寻找我的特定问题的答案,但没有成功。
我的程序中有一个任务需要几秒钟,我想在完成任务时显示一个新表单。 新表单有一个加载栏和一些文本。
我需要显示与任务并行的新表单,否则任务将无法启动,直到我关闭新表单。
这是我现在的解决方案:
private void loadingBar()
{
frmLoading frm = new frmLoading("Please wait while the database is being backed up", "This might take several days.");
frm.ShowDialog();
}
public void Backup()
{
Thread load = new Thread(new ThreadStart(loadingBar));
load.Start();
///Execute a task.
load.Abort();
}
所以,这个工作正常,但我的问题是:在加载线程中关闭“frm”形式以使其停止不是更好吗?
你可以通过几种方式做到这一点......
1 - 您可以像BendEg建议的那样做,并在准备好后调用frmClose
就像是;
Invoke(new Action(Close));
要么
Invoke(new Action(() => frmMain.Close()));
2 - 或者你可以简单地使用后台工作者;
证明这一点的最简单方法是在表单中添加BackgroundWorker,并使用提供的事件;
public Form1()
{
InitializeComponent();
backgroundWorker1.RunWorkerAsync();
MessageBox.Show(@"Please wait while the database is being backed up", @"This might take several days.");
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
Debug.WriteLine("Running"); //Execute a task
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Debug.WriteLine("Ended"); //Dispose of any objects you'd like (close yor form etc.)
}
我希望这有帮助。
您可以在Class-Level上声明表单,然后使用调用将其关闭。 MSDN-Windows窗体调用
像这样:
public class Class1
{
private Form myForm;
public Class1()
{
myForm = new Form();
}
public void DoSomeWork()
{
// ===================================================
// Do Some Work...
// ===================================================
myForm.Invoke(new MethodInvoker(this.Hide));
}
public void Hide()
{
myForm.Hide();
}
public void Backup()
{
myForm.ShowDialog();
Thread load = new Thread(new ThreadStart(DoSomeWork));
load.Start();
}
}
我认为这对你有用。
void YourMethod()
{
WaitForm wf = new WaitForm();
Invoke(new PleaseWaitDelegate(Launch),wf);
bool val = BoolMethodDoWork();
Invoke(new PleaseWaitDelegate(Close), wf);
if(val)
{
MessageBox.Show("Success!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
return;
}
MessageBox.Show("Damn!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
}
delegate void PleaseWaitDelegate(Form form);
void Launch(Form form)
{
new System.Threading.Thread(()=> form. ShowDialog()).Start();
}
void Close(Form form)
{
form.Close();
}
我想这会对你有帮助(如果我理解你的话):
Parallel.Invoke(() => somemethod(), () =>
{
someothertaskmethod();
});
我将方法作为示例来演示运行的2个任务。
您需要使用using System.Threading.Tasks;
使用正确的using语句using System.Threading.Tasks;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.